2011-01-05 101 views
44

我有我添加的所有新的文件之前提交我的工作拷貝到我的倉庫這一行的腳本:如何從存儲庫中刪除所有已刪除的文件?

svn status | grep ^\? | awk '{print $2}' | xargs svn add 

我現在想添加一行,從庫中刪除我的工作全部被刪除的文件複製。換句話說,我不能一一指定它們,我需要用svn狀態檢測它們,然後自動刪除它們。但是該行不起作用。

svn status | grep ^\! | awk '{print $2}' | xargs svn --force delete 

正如你可以看到我已經更換

?」 與 「!」 和

add」 與 「--force delete

你能告訴我,爲什麼它不」工作?

ps。我知道這是一個危險的程序。我已經討論過了。 感謝

感謝

+0

你試過了嗎?爲什麼不自己做,而不是等待答案? – viraptor 2011-01-05 20:25:02

+0

@viraptor我剛剛嘗試過,它不起作用 – aneuryzm 2011-01-05 20:48:44

+0

問題是你正在嘗試刪除標有感嘆號的文件,這意味着什麼是錯誤的。這意味着你已經通過操作系統命令刪除了該文件,而不是svn刪除了哪個SVN不喜歡......這個問題我不明白......你是如何刪除你現在想要的文件的通過svn rm --force來永久化? – khmarbaise 2011-01-05 21:16:57

回答

59

我只是想這和它完美的作品。

$ svn st | grep '^!' | awk '{print $2}' | xargs svn delete --force 
D   groups.pl 
D   textblock.pl 

您的文件是否在名稱中有空格?

等待第二個!我看到了問題。您有:

svn --force delete 

,而不是:

svn delete --force 

--forcedelete命令的參數,而不是svn命令。

+0

我對此有疑問。如果我刪除了一個文件,我是否會放棄所有以前的版本?換句話說,我不能回覆它了嗎?所有以前的承諾也會被刪除? – aneuryzm 2011-01-06 08:02:36

+0

它仍然無法正常工作......但我現在正在考慮使用rsync這樣的工具來備份我的文件(這個評論沒有問題,但我意識到我不能像這樣使用svn) – aneuryzm 2011-01-06 08:33:07

+1

是的,您可以檢索已刪除的文件。您需要使用您刪除的文件找到目錄的修訂版本,並使用修訂釘針(URL末尾的「@」)。從那裏,您可以將缺失的文件複製到當前版本。您也可以執行反向合併來撤消所有更改。事實上,關於svn的一個抱怨是,如果你犯了一個你不認爲是的文件(比如你的密碼),你不能完全刪除(抹去)一個文件。 – 2011-01-06 19:43:30

2

新增您可以簡單地使用

svn add --force . 

svn --force add . 

它會做同樣的東西:添加除了那些匹配的svn所有版本的文件:忽略模式

+0

OP的腳本遞歸地工作 - 這種方法沒有。 – Mortoc 2012-02-16 21:36:29

+3

爲什麼?我已經檢查過它,它可以遞歸地工作 – sdespolit 2012-02-17 09:02:45

40

我發現另一個解決方案。

svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm % 

我一直在使用一個perl oneliner會看到它在http://donunix.blogspot.de/2009/02/svn-remove-all-deleted-files.html

+1

這很棒,而且完美。 – 2012-09-23 20:22:38

+3

謝謝!它甚至可以在文件名中使用空格:) – 2012-10-24 17:25:05

+1

!真棒。專門解決了名稱問題中的空間問題。 – WernerCD 2013-02-22 18:06:15

2

的方法:

svn st | perl -ne 'print "$1\n" if /^\!\s+(.*)/' | xargs svn rm 

這應該與空格字符的文件名也行。

編輯:改進的正則表達式

5
svn status | grep '^!' | sed 's/! *//' | xargs -d '\n' svn delete --force 

的解決方案適用於有空格和特殊字符的文件名。

  • svn status - 列出所有的變化,刪除的文件被標記爲!
  • grep '^!' - 提取與!開始線(即刪除文件)
  • sed 's/! *//' - 後去除之初! -char和空間
  • xargs -d '\n' - 將每個輸入行(包括空格和特殊字符)視爲單獨的參數,並將它們傳遞給svn delete --force
+0

僅供參考'xargs'的'-d'選項在OS X上不受支持 - 所以似乎只適用於Linux(或者我錯過了什麼?) – HughHughTeotl 2015-11-30 15:48:13

+0

Updoted for'-d'\ n''選項! – Mitchapp 2017-06-16 08:15:43

相關問題