2010-01-12 184 views
32

所有歷史記錄中刪除的文件有沒有辦法刪除從SVN庫文件,包括其所有歷史記錄?當我想擺脫駐留在repo中的大型二進制文件時,會出現此問題。從SVN倉庫

我只知道一個方法可能會在這種情況下幫助:

  1. 轉儲全部回購與svnadmin實用的幫助。
  2. 使用grep篩選轉儲的文件。 grep的應該使用的文件名,並寫在其他轉儲文件
  3. 導入最後一個轉儲文件與svnadmin

但是,這是過於複雜和不可靠的。也許還有另一種解決方案?

回答

6

但是,這是過於複雜和不可靠的。

我不知道爲什麼這不應該被認爲是可靠的。但是,如果你想完全擺脫文件,歷史和所有文件,無論這個文件是否屬於以前版本的一部分,只有一種方法可以實現,而且這種方式確實很複雜。正確如此。 SVN是一個有着單一目標的工具:永遠不會丟失任何文件,即使它被刪除了。強迫它做其他事情應該很難。

29

這最近已成爲更加直接用命令svndumpfilter。詳細信息可在顛覆文檔here中找到。基本上,爲了避免衝突(解釋爲here),它會進行回購轉儲並重新提交每個提交,包括或排除給定的文件前綴。基本語法:

svndumpfilter exclude yourfileprefix <yourdump> yournewdump 

排除可能是什麼問題提問者正在尋找,但你也可以使用包括,比方說,提取回購的子樹,以旋轉它作爲自己的存儲庫。

顛覆顛覆(非常元)的最新版本也可以採取全局模式。我最近不得不從回購刪除所有的PDF文件,這是非常容易,像這樣做:

svndumpfilter exclude --pattern '*.pdf' <dump> dump_nopdfs 

更多使用信息可以通過調用svndumpfilter helpsvndumpfilter help exclude被發現。

+0

所以整個過程是:'svnadmin dump> myDump; svndumpfilter排除myFile < myDump > newDump;貓newDump | svnadmin加載myRepositoryURL;'正確? – Shawn 2013-01-24 20:01:31

+0

我沒有測試過,但看起來不錯。 – 2013-01-25 23:05:10

+10

好吧,我試過了,過程看起來像這樣:'svnadmin dump path_to_repository> old.dump; svndumpfilter排除file_prefix < old.dump > new.dump; rm -rf path_to_repository; svnadmin創建path_to_repository; svnadmin load path_to_repository Shawn 2013-01-28 19:36:49

3

我正面臨類似的問題,除了我需要刪除多個文件,而不僅僅是一個文件,而且我們在Subversion 1.6上,它不支持--patern指令。

- 備份當前SVN

$ cp -R /svn /svnSAVE 

- 自卸庫

$ svnadmin dump /svn/root > svnDump 

- 創造新的轉儲,而排除了非常大的文件

$ svndumpfilter exclude "/path/file.csv" <svnDump> newSvnDump0 
-- {note: should see a message like this}: 
--   Dropped 1 node: 
--     '/path/file.csv' 

- 創建另一個新轉儲時排除另一個非常大的文件

$ svndumpfilter exclude "/path/anotherFile.csv" <newSvnDump0> newSvnDump1 

- 刪除舊的SVN

$ rm -rf /svn 

- 重建SVN目錄

$ mkdir -p /svn/root 

- 重建SVN

$ svnadmin create /svn/root 

- 重新填充新鮮庫轉儲

$ cat newSvnDump1 | svnadmin load /svn/root 

- 更新從保存的副本conf文件到新副本......

$ cp /svnSAVE/root/conf/* /svn/root/conf 

現在庫不應包含2個大文件「FILE.CSV」和「anotherFile.csv」

0

我同意McDowell的建議,但是希望建議您考慮用文本文件替換大文件,該文件僅包含已刪除條目的文件的散列。

如果您有大量的.o文件意外檢查構建目錄,這可能不合適。但是如果你從一個包含你想要的二進制文件的目錄中刪除一些你不想要的二進制文件,那麼你冒着犯了一個代價昂貴的錯誤的風險很高。至少,考慮從中繼和大多數分支中移除它們,但留下一個包含佔位符文本文件的功能分支和原始二進制文件的散列。這至少可以證明後面發生的事情,驗證一個不應該被刪除的雜散拷貝實際上是正確的文件,並將其放回到版本控制之下。

而且,顯然,在你甚至考慮完成這些任務之前,將整個回購回覆爲只讀的某些內容,如一些M-Disc或其他內容。