1. 程式人生 > >SubVersion程式碼庫的回滾

SubVersion程式碼庫的回滾

    我剛開始使用SubVersion時, 想把svn程式碼庫回滾到以前某個版本,  上網找來找去都找不到(那時文件比較少), 讓我鬱悶了好一陣子.  現在記錄一下 SubVersion回滾的方法:

   第一種方法: 使用TortoiseSVN進行回滾. 很明顯, 這種方法只適用於windows平臺. 以下摘自 TortoiseSVN文件:

B.4. 回滾版本庫裡的版本

B.4.1. 使用版本日誌對話方塊

如果想恢復某個版本或者版本範圍的變更,最簡單的方法是使用版本日誌對話方塊。這種方法也可以用來撤銷最近的若干次變更,把以前的某個版本變成最新版。

  1. 選中想要恢復變更的檔案或者資料夾。如果想要恢復所有的變更,需要選中最頂層的資料夾。

  2. 選擇TortoiseSVN顯示日誌,顯示出版本列表。有可能需要使用全部顯示或者下100 按鈕,把想要恢復的版本顯示出來。

  3. 選中想要恢復的版本。如果想要恢復一個版本範圍,選中想要恢復的第一個版本,按住shift鍵,然後選中想要恢復的最後一個版本。注意,當恢復多個版本的時候,這些版本必須在列表中是連續的。用滑鼠右鍵點選選中的版本(段),然後選擇右鍵選單恢復這些版本的變更

  4. 如果想要把以前的某個版本變成最新版本,右鍵點選選中的版本(範圍),然後選擇右鍵選單恢復到此版本。就能夠撤銷被選中版本後面所有的變更。

工作拷貝已經恢復到了變更以前的狀態。檢查恢復後的結果,然後提交變更。

B.4.2. 使用合併對話方塊

如果要撤銷更大版本範圍的變更,可以使用合併對話方塊。上一個方法在後臺使用了合併的機制,在這個方法裡我們直接使用合併功能。

  1. 在工作拷貝上選擇TortoiseSVN合併

  2. 起始:文字框裡輸入想要恢復的變更所在的分支或標籤的URL。它也將作為預設URL。

  3. 起始版本文字框裡輸入當前工作拷貝的版本號。如果能夠保證沒有其他人會提交變更,可以使用最新版本

  4. 確認使用“起始:”的 URL

    檢查框處於被選中的狀態。

  5. 結束版本裡輸入想要恢復到的版本號。比如,想要恢復的最小版本號的一個版本號。

  6. 點選合併按鈕完成合並。

工作拷貝已經恢復到了變更以前的狀態。檢查恢復後的結果,然後提交變更。

B.4.3. 使用svndumpfilter

因為TortoiseSVN絕不會丟棄資料,所以那些被回滾的版本仍然以中間版本的形式被保留在版本庫裡。只是最新版本已經回到了以前的狀態。如果想讓版本庫裡的某些版本徹底消失,擦去這些版本曾經存在過的所有痕跡,就必須採取更極端的手段。不推薦使用這種方法,除非有很好的理由。比如某人向一個公開的版本庫裡提交了一份機密檔案。

從版本庫裡刪除資料的唯一方法就是使用svnadmin這個Subversion命令列工具。具體如何實現請參考Subversion手冊

第二種方法: 使用SubVersion自帶的svn merge 命令. 這種方法適用於任何能使用SubVersion的平臺. 以下摘自 <使用SubVersion進行版本控制> 4.4.2節:

svn merge另一個常用的做法是取消已經做得提交,假設你愉快的在/calc/trunk工作,你發現303版本對integer.c的修改完全錯了,它不應該被提交,你可以使用svn merge來“取消”這個工作拷貝上所作的操作,然後提交本地修改到版本庫,你要做得只是指定一個相反的區別:

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U  integer.c

$ svn status
M  integer.c

$ svn diff
…
# verify that the change is removed
…

$ svn commit -m "Undoing change committed in r303."
Sending        integer.c
Transmitting file data .
Committed revision 350.

我們可以把版本庫修訂版本想象成一組修改(一些版本控制系統叫做修改集),通過-r選項,你可以告訴svn merge來應用修改集或是一個修改集範圍到你的工作拷貝,在我們的情況例子裡,我們使用svn merge合併修改集#303到工作拷貝。

記住回滾修改和任何一個svn merge命令都一樣,所以你應該使用svn status或是svn diff來確定你的工作處於期望的狀態中,然後使用svn commit來提交,提交之後,這個特定修改集不會反映到HEAD版本了。

繼續,你也許會想:好吧,這不是真的取消提交吧!是吧?版本303還依然存在著修改,如果任何人取出calc的303-349版本,他還會得到錯誤的修改,對吧?

是的,這是對的。當我們說“刪除”一個修改時,我們只是說從HEAD刪除,原始的修改還儲存在版本庫歷史中,在多數情況下,這是足夠好的。大多數人只是對追蹤HEAD版本感興趣,在一些特定情況下,你也許希望毀掉所有提交的證據(或許某個人提交了一個祕密檔案),這不是很容易的,因為Subversion設計用來不丟失任何資訊,每個修訂版本都是不可變的目錄樹 ,從歷史刪除一個版本會導致多米諾效應,會在後面的版本導致混亂甚至會影響所有的工作拷貝。 [9]

解釋一下,  svn merge -r 303:302 http://svn.example.com/repos/calc/trunk 這個命令是把當前目錄當作工作拷貝.  如果想指定工作拷貝路徑(如: c:/test), 則命令變成以下:

  svn merge -r 303:302 http://svn.example.com/repos/calc/trunk  c:/test