如何从代码库中删除所有已删除的文件?

48

我有一个脚本,在提交我的工作副本到版本库之前,我会使用这行代码将所有新文件添加进去:

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

我现在想添加一条删除工作副本中所有已删除文件的命令到仓库中。换句话说,我无法一个一个地指定它们,需要用 svn 状态检测它们,然后自动删除它们。但是这条命令不起作用。

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

你可以看到我已经将 "?" 替换为 "!",将 "add" 替换为 "--force delete"。你能告诉我为什么它不起作用吗?

附言:我知道这是一项风险较高的操作。我已经讨论过所有相关内容。谢谢。

谢谢。


你试过了吗?为什么不自己动手做,而是等待答案呢? - viraptor
@viraptor 我刚试了一下,不起作用。 - aneuryzm
问题在于您试图删除标有感叹号的文件,这意味着出现了错误。这意味着您已通过操作系统命令删除了该文件,而不是使用 SVN delete,这是 SVN 不喜欢的......问题是我不明白...您如何删除现在想要通过 svn rm --force 永久删除的文件? - khmarbaise
@khmarbaise 我一直在使用 PHP 脚本来完成这个任务。我知道这听起来不太对,也许我不会继续使用它。我只是想让 shell 脚本正常工作。 - aneuryzm
你收到错误信息了吗? - JOTN
希望我没有把事情搞复杂,但是你知道用这个操作会从头部删除它们,对吧?通过查看早期版本,它们仍然可以恢复。如果你正在进行标准的代码版本控制,那正是你想要的!如果你把错误的东西放入svn(例如,在公共存储库中放置机密信息),那么你需要的是其他解决方案。 - Miquel
5个回答

60

我刚刚尝试了这个方法,它完美地运行了。

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

你的文件名中是否有空格?

等一下!! 我看到问题所在了。你有:

svn --force delete

而不是:

svn delete --force

--forcedelete命令的参数,不是svn命令的参数。


我有一个关于它的问题。如果我删除一个文件,那么我会失去所有之前的版本吗?换句话说,我不能再恢复它了,对吧?所以所有之前的提交也都被删除了? - aneuryzm
还是不起作用...但我现在考虑使用类似rsync的工具来备份我的文件(这个评论不在讨论范围内,但我意识到我不能像这样使用svn) - aneuryzm
1
是的,您可以检索已删除的文件。您需要找到包含所删除文件的目录的修订版本,并使用修订版本固定(URL末尾的“@”符号)。从那里,您可以将缺失的文件复制到当前修订版本。您还可以执行反向合并以撤消所有更改。事实上,svn的一个抱怨是,如果您提交了不应该提交的文件(例如密码),则无法完全删除(抹消)文件。 - David W.
1
针对在xCode项目中不会因带有“@”符号的文件而出错的情况:svn st | grep '^!' | awk '{print $2}' | xargs -I file svn delete file@ - trousyt
2
这在文件名中带有空格和特殊字符时无法工作,anton_rh的答案可以解决这个问题。 - fonZ

44

我还找到了另一个解决方案。

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

我在这个链接上看到了它。


2
太棒了。解决了我的文件名中空格的问题,非常有效。 - WernerCD
2
很棒的脚本。也适用于空格。 - Dan

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

该解决方案适用于文件名包含空格和特殊字符的情况。
  • svn status - 列出所有更改,已删除文件标记为!
  • grep '^!' - 提取以!开头的行(即已删除文件)
  • sed 's/! *//' - 删除开头的!字符和其后的空格
  • xargs -d '\n' - 将每个输入行(包括空格和特殊字符)作为单独的参数处理,并将它们传递给svn delete --force

FYI,xargs-d 选项在 OS X 上不受支持 - 所以似乎只适用于 Linux(或者我漏掉了什么?) - HughHughTeotl

2
关于添加功能,您可以简单地使用。
svn add --force .

或者
svn --force add .

它将执行相同的操作:添加所有未版本化的文件,除了与svn:ignore模式匹配的文件


2

使用Perl oneliner的方法如下:

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

这也适用于文件名中包含空格的情况。
编辑:正则表达式已改进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接