2009-05-02 26 views
418

我正在和一位朋友一起工作,我想返回到舊版本的代碼並將其設置爲當前。我該怎麼做?如何在Subversion中返回舊版本的代碼?

我在vs08上使用「anksvn」。

我有我想要在我的電腦上的版本,但提交失敗;我得到的消息是 「提交失敗,文件或目錄已過期。」

我的電腦上也有顛覆客戶端。

回答

686

基本上你需要「向後合併」 - 當前和以前的版本之間施加diff來當前版本(所以你最終的工作副本看起來像老版本),然後再次提交。因此,例如,從版本150(電流)回到修訂140:

svn update 
svn merge -r 150:140 . 
svn commit -m "Rolled back to r140" 

顛覆紅皮書有good section about this。你想恢復>>RevertRevert to Revision

+3

但合併不覆蓋我的更改和新版本。 – 2009-05-02 08:56:35

+1

哪些變化?任何你不想在你的工作副本中所做的更改都可以通過svn還原來刪除。承諾的更改將通過此次合併「撤消」。 – 2009-05-02 09:07:58

+71

如果您使用的是TortoiseSVN,請右鍵單擊文件選擇合併,然後合併一系列修訂。在日誌框中鍵入140-150,然後單擊反向複選框。之後,照常進行。這將與Jon的例子執行相同的操作。 – DavGarcia 2011-01-10 23:08:30

0

與舊版本同步並提交。這應該做的伎倆。

Here's也是撤銷更改的說明。

4

單擊鼠標右鍵,是它的.svn目錄知道它是過去的代碼,所以需要更新。但是你只能在顛覆歷史的頭部實際上做出改變。

您可以使用

svn update -r <earlier_revision_number>

檢查項目的各種舊版本,直到你找到正確的版本號,你的好版本。當你找到它時,更新到最新的(head)修訂版,然後按照上面的建議應用svn merge。

如果你真的無法找到它,需要提交您的PC上的副本,然後得到一個新的更新到最新版本,並複製你的「好」的版本在它的頂部( .svn文件夾!)。從文件夾和顛覆中刪除不在正確副本中的任何文件,並承諾您現在擁有的文件。

156

你不能與你有你的電腦上的良好的直接拷貝做任何事情的原因最高層次

23

使用合併撤銷整個簽入的標準方式非常有效,如果這就是您想要執行的操作。但是,有時候,你想要做的只是恢復一個文件。有沒有合法的方式做到這一點,但有一個黑客:

  1. 找到你想要使用svn日誌的版本。
  2. 使用SVN的出口子命令:

    SVN出口http://[email protected]/tmp目錄/文件名

(其中123是一個很好的版本的文件的版本號。)然後移動或複製該單個文件以覆蓋舊文件。檢查修改後的文件,你就完成了。

28

只需使用這條線

SVN更新-r yourOldRevesion

你可以知道你的當前版本使用:

SVN信息

5

我想這是最適合的:

向後合併,例如,如果提交的代碼包含從 rev 5612到5616的修訂版,只需將其向後合併即可。它在我的工作。

例如:

svn merge -r 5616:5612 https://<your_svn_repository>/ 

它將包含合併代碼回以前的版本,那麼你可以提交。

8

多一點老派

svn diff -r 150:140 > ../r140.patch 
patch -p0 < ../r140.patch 

則通常

svn diff 
svn commit 
3

這是我做過什麼,對我的工作。

我想撤消多次提交中的更改,這些更改是在特定時間執行的,並且希望轉到上一個提交點。

  1. 前往團隊 - >顯示歷史記錄。
  2. 右鍵單擊要忽略的修訂版本或範圍。
  3. 選擇「恢復更改」選項。

這將運行反向合併,撤銷工作副本中的更改。

只需查看代碼並提交即可。

-1

以下爲我工作。

我有很多本地更改,需要丟棄本地副本中的內容並簽出SVN中的最新穩定版本。

  1. 檢查所有文件(包括被忽略的文件)的狀態。

  2. 刷新所有行以獲取新添加和忽略的文件。

  3. 將其替換爲//

  4. 和rm -rf所有行。

    svn status --no-ignore | grep'^ [?I]'| sed「s/^ [?I] //」| xargs -I {} rm -rf「{}」

1

右鍵單擊項目>替換爲>修訂或URL>選擇要恢復的特定修訂。

現在將本地更新代碼版本提交到存儲庫。這將使代碼庫恢復到特定的版本。

1

大多數以前的答案一直在使用反向合併,這通常是正確的答案。但是,有一種情況(這種情況剛好發生在我身上)不在的地方。

我做了一個小小的修改並提交後,意外地將一個帶有Unix行結尾的文件改成了DOS行結尾。這很容易被撤消,或者通過改變行結尾並再次提交,或者通過反向合併,但它具有使我的編輯列表成爲文件的每一行的源的效果。 (有趣的是,TortoiseSVN的Windows上沒有得到受此影響,只有在命令行svn blame

如果你想保持歷史報告svn blame,我認爲你需要做到以下幾點:

  • 刪除文件並提交。
  • 在存儲庫中,將文件的前一個好副本複製到頭部,然後提交。
  • 恢復您確實想保留的所有修改。

刪除有點嚇人,但請記住,您始終將該文件保存在存儲庫中,因此恢復它並不是什麼大問題。這裏有一些代碼來說明這些步驟。假設xxx是最後一個好副本的修訂版號。

svn rm svn+ssh://path/to/file 
svn copy svn+ssh://path/to/[email protected] svn+ssh://path/to -m"Restore good copy" 
svn update 
<restore the edits> 
svn commit -m"Restore edits" 

請注意,對於存儲庫中的副本,目標需要是目錄,而不是文件名。

相關問題