我們團隊中的某個人意外提交了包含我們存儲庫密碼的文件。密碼不容易改變。刪除SVN提交的所有痕跡
有沒有一種方法,具有完全的管理權限,刪除此提交的所有痕跡?我不是在談論恢復或刪除,這顯然會將密碼保留在文件歷史記錄中。
我們團隊中的某個人意外提交了包含我們存儲庫密碼的文件。密碼不容易改變。刪除SVN提交的所有痕跡
有沒有一種方法,具有完全的管理權限,刪除此提交的所有痕跡?我不是在談論恢復或刪除,這顯然會將密碼保留在文件歷史記錄中。
是的,但它並不適合心靈的隱隱。您必須使用svnadmin dump
和svnadmin 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版本庫複製到臨時目錄很容易。當你這樣做的時候,你可以繼續嘗試,直到你把它做好,然後把固定的存儲庫複製回原處。
見在FAQ
答案有一些特殊情況下,您可能要銷燬文件的全部證據或提交。 (也許有人不小心犯了一個機密文件。)這並不容易,因爲Subversion是故意設計的,永遠不會丟失信息。修訂是不可改變的樹,它們彼此相互構建。從歷史記錄中刪除修訂版會導致多米諾骨牌效應,在隨後的所有修訂中造成混亂,並可能使所有工作副本無效。
但是,該項目計劃在某一天實施一個svnadmin obliterate命令,該命令可以完成永久刪除信息的任務。 (請參閱問題516.)
與此同時,您唯一的方法是使用svnadmin轉儲您的存儲庫,然後通過svndumpfilter(不包括壞路徑)將轉儲文件轉儲到svnadmin加載命令中。有關詳細信息,請參閱Subversion手冊的第5章。
請注意,'svndumpfilter'只知道如何包含或排除路徑。除非你小心,否則文件可能會完全消失。 – kdgregory 2011-04-06 13:11:56
感謝您的詳細解答。知道了這一點,我們認爲改變密碼更簡單,而不是通過你描述的步驟。 – MasterScrat 2011-04-07 13:38:20