2010-05-11 114 views
145

我在SVN回購中顯示了一個文件,我想要恢復到以前的版本。在SVN中做這件事的方法是什麼?我只想將這個特定的文件降級到舊版本,而不是整個回購。將SVN中的單個文件還原爲特定修訂版

謝謝。

$ svn log myfile.py 
---------------------- 
r179 | xx | 2010-05-10 

Change 3 
---------------------- 
r175 | xx | 2010-05-08 

Change 2 
---------------------- 
r174 | xx | 2010-05-04 

Initial 
+0

當你說回覆,你是什麼意思,7年前,大聲笑 – 2017-02-21 03:08:09

回答

161

如果你只是想在你的工作拷貝舊文件:

svn up -r 147 myfile.py 

如果要回滾,看到這個「How to return to an older version of our code in subversion?」。

+6

,但下一次你更新它會得到你不想回來的文件...:S – andygoestohollywood 2013-11-15 09:53:40

+1

如果你不想回來, svn提交該文件,將你想要的版本加入回購 – 2014-01-27 10:21:22

+12

這可能實際上並沒有做問題提供者想要的東西。使用它,工作副本是乾淨的,不能按原樣提交,沒有指定版本號的「svn update」將檢索最新的不需要的版本。 – CXJ 2014-02-19 02:35:54

49

對於單個文件,你可以這樣做:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

你可以做svn revert <file>但只會恢復最後一個工作副本。

+2

出口,然後將其粘貼到您的本地副本,然後再次提交? – tgkprog 2013-09-17 18:53:30

+0

@tgkprog這是一種方法,是的 – 2013-09-17 20:59:42

+0

@tgkprog和什麼是「首選」的方式? – hbogert 2014-10-28 08:43:51

13

最好的辦法是:

svn merge -c -RevisionToUndo ^/trunk 

這將撤消不是簡單地恢復那些你不喜歡撤消文件修訂的所有文件。不要忘記破折號(-)作爲修訂的前綴。

svn revert File1 File2 

現在提交更改。

5

我發現通過svn cat命令執行此操作非常簡單,因此您甚至不必指定修訂。

​​

這可能不會回來角色索引節點(元數據)的數據,如時間戳。

+0

然後提交文件,以便它進入回購 – tgkprog 2013-09-17 18:54:38

+2

這對我的工作比更新更好。因爲更新不允許您提交對該文件所做的修改。 (svn 1.8.3) – 2013-10-24 07:54:57

44
svn revert filename 

這應該還原單個文件。

+2

更長命令的其他答案是什麼?謝謝。 – masterxilo 2014-08-06 12:50:49

+0

不客氣。我不知道什麼是與其他答案..大聲笑 – thestar 2014-08-20 14:46:44

+0

他們起來,他們更長。我同意。 – 2014-09-02 10:49:19

41

svn貓也修改了arg!

svn cat -r 175 mydir/myfile > mydir/myfile

+0

這工作得很好。謝謝。 – 2015-08-26 14:42:44

+11

**這是迄今爲止頁面上最好的答案。**它將更改後的文件保留在可提交的狀態。 – dotancohen 2016-03-02 14:08:54

+0

當你粘貼到一個新文件 – ahnbizcad 2016-03-04 21:19:02

12

到目前爲止,這裏所有的答案似乎有顯著缺點,很複雜(需要找到回購URI),或者他們不這樣做的問題可能問:如何獲得回購在工作狀態與舊版本的文件

svn merge -r head:[revision-number-to-revert-to] [file-path]是IMO最乾淨和最簡單的方法來做到這一點。請注意,帶回刪除的文件似乎並沒有這樣工作[1]。還可以看到以下問題:Better way to revert to a previous SVN revision of a file?

[1]對於要svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up,也看到What is the correct way to restore a deleted file from SVN?

+0

我想說的是,至少對於我的Subversion版本,'svn merge'由於某些原因不會將多個文件作爲參數。在這種情況下,它似乎什麼也沒做(沒有錯誤信息)。 – Wrzlprmft 2016-01-09 10:53:03

+0

但我的命令仍然對每個文件重複它的作品,對吧? – 2016-01-09 14:31:55

+0

是的,它的確如此。 – Wrzlprmft 2016-01-09 16:07:39

3

如果這只是一對夫婦的文件,如果你使用龜SVN,你可以用下面的辦法:

  1. 右鍵單擊源文件,並選擇「TortoiseSVN」 - >「顯示日誌」。
  2. 右鍵單擊日誌中的修訂版,然後選擇「將修訂版保存到...」。
  3. 讓舊版本覆蓋您的當前文件。
  4. 提交覆蓋的源文件。
+0

這會保存一個新的未版本控制的文件,如file-xxxx,其中xxxx是舊版本號。我們接下來做什麼?刪除新版本(HEAD例如),重命名新文件,添加,提交? – Heinz 2018-01-19 15:49:06

+0

不,請勿將它與修訂號一起保存在文件名中。使用與同一文件的當前版本完全相同的文件名保存它(換句話說,文件名中不包含xxxx)。然後在那之後做一個普通的提交。 – Elling 2018-02-06 23:56:39

3

驚訝提到這個

誰都沒有查清的版本號,你可以寫這篇文章,如果你只是承諾要恢復的東西,這不會工作,如果你改變了一些其他的文件和目標文件是不是最後更改的文件

svn merge -r PREV:HEAD file 
+0

如果您有意見,請在進行編輯之前在這裏討論? – 2017-11-17 17:24:14

+0

問題中的場景是否需要反向合併最近的更改,以便我們應該應用從HEAD到PREV所需的更改? – 2017-11-25 17:33:23

+0

該命令應該是'svn merge -r HEAD:PREV file' as @Nick Russo says – Heinz 2018-01-19 16:01:40

2

只需加入到@Mitch Dempsy答案,因爲我沒有足夠的代表評論呢。

svn export -r <REV> svn://host/path/to/file/on/repos --force 

添加--force將覆蓋與出口的本地副本,那麼你可以做一個svn承諾將其推到倉庫。

+0

and this is the best answer :) – Zgr3doo 2017-09-26 10:40:04

1

你想幹什麼

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

一旦你這樣做,你將有該文件的修訂工作時在可提交狀態。提交文件。

相關問題