2011-04-06 156 views
22

我們團隊中的某個人意外提交了包含我們存儲庫密碼的文件。密碼不容易改變。刪除SVN提交的所有痕跡

有沒有一種方法,具有完全的管理權限,刪除此提交的所有痕跡?我不是在談論恢復或刪除,這顯然會將密碼保留在文件歷史記錄中。

回答

27

是的,但它並不適合心靈的隱隱。您必須使用svnadmin dumpsvnadmin load重新創建您的存儲庫。

如果您選擇這樣做,第一步是停止您的用戶提交,並對您的存儲庫進行備份。我還建議您通過您的存儲庫副本上的步驟進行操作;您可以使用rsync將整個存儲庫目錄複製到一個臨時目錄中,然後從那裏開始工作。

對於這些指令,我會在臨時目錄下創建一個新的倉庫:

tmp, 502> svnadmin create example.repo 
tmp, 503> svn co file://`pwd`/example.repo example 
Checked out revision 0. 

我創建了一個包含4次修訂,第三它需要被刪除的文件:

example, 536> svn log test.txt 
------------------------------------------------------------------------ 
r4 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line 

post-bad commit 
------------------------------------------------------------------------ 
r3 | kgregory | 2011-04-06 08:46:42 -0400 (Wed, 06 Apr 2011) | 1 line 

bad revision 
------------------------------------------------------------------------ 
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line 

good revision 
------------------------------------------------------------------------ 
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line 

initial revision 
------------------------------------------------------------------------ 

因此,我們需要使用-r標誌來指定修訂範圍,以便在壞的之前和之後轉儲修訂版本。第二次轉儲中的--incremental標誌很重要,因爲它會告訴加載命令不要創建新文件。

請注意,我從持有存儲庫的相同目錄運行這些命令。

svnadmin dump -r 1:2 example.repo/ > pred.svndump 
* Dumped revision 1. 
* Dumped revision 2. 
tmp, 552> svnadmin dump -r 4:4 --incremental example.repo/ > succ.svndump 
* Dumped revision 4. 

現在移動原倉庫的方式進行,並使用相同的名稱創建一個空倉庫:

tmp, 540> mv example.repo example.repo.bak 
tmp, 541> svnadmin create example.repo 

並導入轉儲文件的內容。

tmp, 569> svnadmin --quiet load example.repo < pred.svndump 
tmp, 570> svnadmin --quiet --ignore-uuid load example.repo < succ.svndump 

現在告訴大家刪除他們的工作目錄,並檢查出新鮮。你應該看到以下日誌:

example, 574> svn log test.txt 
------------------------------------------------------------------------ 
r3 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line 

post-bad commit 
------------------------------------------------------------------------ 
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line 

good revision 
------------------------------------------------------------------------ 
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line 

initial revision 
------------------------------------------------------------------------ 

有一個巨大的警告:此過程假定有沒有因爲受到任何提交的文件中的錯誤提交(即後繼轉儲只包含的變化到其他文件)。

如果不是這種情況,您仍然可以刪除修訂版,但這需要更多的工作。您需要創建一個新的簽入,其中包含該文件的乾淨副本以及任何其他隨文件一起更改的文件。然後創建多個dumpfiles,排除包含壞文件的任何修訂。

最後:我強烈建議幾次幹運行。正如你可以從我的例子中的歷史數字中看到的,我搞砸了幾次。正如我在開始時所說的,將Subversion版本庫複製到臨時目錄很容易。當你這樣做的時候,你可以繼續嘗試,直到你把它做好,然後把固定的存儲庫複製回原處。

+2

感謝您的詳細解答。知道了這一點,我們認爲改變密碼更簡單,而不是通過你描述的步驟。 – MasterScrat 2011-04-07 13:38:20

6

見在FAQ

答案有一些特殊情況下,您可能要銷燬文件的全部證據或提交。 (也許有人不小心犯了一個機密文件。)這並不容易,因爲Subversion是故意設計的,永遠不會丟失信息。修訂是不可改變的樹,它們彼此相互構建。從歷史記錄中刪除修訂版會導致多米諾骨牌效應,在隨後的所有修訂中造成混亂,並可能使所有工作副本無效。

但是,該項目計劃在某一天實施一個svnadmin obliterate命令,該命令可以完成永久刪除信息的任務。 (請參閱問題516.)

與此同時,您唯一的方法是使用svnadmin轉儲您的存儲庫,然後通過svndumpfilter(不包括壞路徑)將轉儲文件轉儲到svnadmin加載命令中。有關詳細信息,請參閱Subversion手冊的第5章。

+0

請注意,'svndumpfilter'只知道如何包含或排除路徑。除非你小心,否則文件可能會完全消失。 – kdgregory 2011-04-06 13:11:56