如何从存储库中删除所有已删除的文件?

问题描述:

我有我添加的所有新的文件之前提交我的工作拷贝到我的仓库这一行的脚本:如何从存储库中删除所有已删除的文件?

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

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

$ 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

新增您可以简单地使用

svn add --force . 

svn --force add . 

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

+0

OP的脚本递归地工作 - 这种方法没有。 – Mortoc 2012-02-16 21:36:29

+3

为什么?我已经检查过它,它可以递归地工作 – sdespolit 2012-02-17 09:02:45

我发现另一个解决方案。

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

的方法:

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

这应该与空格字符的文件名也行。

编辑:改进的正则表达式

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