2009-01-30 61 views
60

這些說明有點嚇人和混亂:http://svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3。 而且他們似乎沒有提到,如果您在執行「svn rm」[1]之後還沒有辦理入住手續,那就更簡單了。什麼是在顛覆中取消刪除文件的簡單方法?

所以我認爲這將是一個很好的地方記錄一個簡單的答案,爲這些谷歌搜索。

[1]對一個svn新手來說,「svn rm」可能會立即銷燬該文件。我記得svn rm認爲只要將它從源代碼管理中刪除,並在文件本身消失時就嚇壞了。因此,一個子問題是,如何在不實際刪除本地副本的情況下從版本控制中刪除文件的正確方法是什麼?

+0

`svn status | grep「^ D」| awk'{print $ 2}'| xargs svn revert` – sfiore 2017-01-17 15:40:50

回答

73

如果你只是做

svn rm foo.txt 

,那麼你可以撤消與單純

svn revert foo.txt 

如果你已經簽入後做了「svn rm」,那麼你可以看看日誌(svn log) ,找到文件存在的最後一個修訂版本,並從該版本中獲取它。

一種方法是在具有該文件的舊版本中進行合併。假設當前版本是123,並與該文件的最後一個版本是120,那麼這樣做:

svn merge -r123:120 

也許首先做一個預演,以確保它不會做任何你不想:

svn --dry-run merge -r123:120 

對於子問題,如何從SVN文件而不刪除本地副本:

svn rm foo.txt --keep-local 

或者當然,你可以只複製到一個臨時文件SVN rm'ing之前再copy回去:

cp foo.txt foo.txt-tmp 
svn rm foo.txt 
(svn ci -m "just removed foo.txt from the repository") 
cp foo.txt-tmp foo.txt 
+0

合併的問題是它失去了文件的以前的歷史。 svn cp在Stefan的回答中詳細說明可能更好,也更容易理解。 – Avi 2010-06-02 21:48:38

+0

偉大的回答,拯救了我的一天。謝謝! pls1 – 2016-05-23 11:44:59

+0

我發現如果更改版本順序,它只是將刪除的文件添加到當前的工作副本,而沒有其他更改沒有刪除的文件,例如`svn merge -r120:123 svn_url .` – zhuguowei 2016-09-12 03:13:50

30

要刪除一個文件,但將其保留在工作拷貝,使用

svn rm foo.txt --keep-local 

要在提交刪除後獲取文件,可以使用merge命令或copy命令 - 兩者都將保留文件歷史記錄。由於合併的方式已經被其他地方所描述的,這裏的副本方式:

svn rm foo.txt 
svn ci foo.txt -m "removed file" 
(now at r5 as an example) 
svn cp url/to/removed/foo.txt -r4 foo.txt 
svn ci foo.txt -m "got file back" 
33

無論出於何種原因,該-r ARG不是爲我工作(SVN版本1.6.9)。我在src之前和之後嘗試,但不斷收到一條消息,指出在當前修訂版(duh)中找不到該文件。和--revision一樣。使用@風格的語法雖然工作:

svn cp url/to/removed/[email protected] foo.txt 
1

我用從前版本使用烏龜,複製菜單項,爲我工作,並保持歷史。

1

恢復SVN中的已刪除文件。在刪除之前查找修訂版本號(比如341)。然後單獨將該文件恢復爲該修訂版本號。

svn up -r341 [path_to_deletedFile] 
相關問題