【问题标题】:How to remove all deleted files from repository?如何从存储库中删除所有已删除的文件?
【发布时间】:2011-06-04 06:34:38
【问题描述】:

我有一个脚本,我在其中添加所有新文件,然后使用此行将我的工作副本提交到我的存储库:

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

我现在想添加一行,从存储库中删除我工作副本中所有已删除的文件。换句话说,我不能一一指定,我需要用svn status检测它们,然后自动删除它们。但是这条线不起作用。

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

如你所见,我已经替换了

“?”与“!”和

“add”与“--force delete”

你能告诉我为什么它不起作用吗?

ps。我知道这是一个危险的过程。我已经讨论过了。 谢谢

谢谢

【问题讨论】:

  • 你试过了吗?为什么不自己做而不是等待答案?
  • @viraptor 我刚试过,不行
  • 问题是您试图删除标有感叹号的文件,这意味着有问题。这意味着您已经通过操作系统命令删除了该文件,而不是 SVN 不喜欢的 svn delete ......我不明白的问题......你是如何删除你现在想要的文件的通过 svn rm --force 永久化?
  • @khmarbaise 我经常使用 php 脚本执行此操作。我现在,这听起来不对,可能我不会使用它。我只是想让 shell 脚本工作。
  • 您收到错误消息了吗?

标签: svn


【解决方案1】:

我刚试过,效果很好。

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

您的文件名称中有空格吗?

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

svn --force delete

而不是:

svn delete --force

--force 是delete 命令的参数,而不是svn 命令的参数。

【讨论】:

  • 我有一个问题。如果我删除一个文件,我会丢失所有以前的版本吗?换句话说,我不能再恢复它了,对吧?那么之前的所有承诺也会被删除?
  • 它仍然不起作用......但我现在正在考虑使用 rsync 之类的工具来备份我的文件(这个评论是毫无疑问的,但我意识到我不能像这样使用svn)
  • 是的,您可以检索已删除的文件。您需要找到包含您删除的文件的目录的修订版,并使用修订版固定(URL 末尾的“@”)。从那里,您可以将丢失的文件复制到当前版本。您还可以进行反向合并以撤消所有更改。事实上,对 svn 的抱怨之一是,如果你提交了一个你不应该提交的文件(比如你的密码),你就不能完全删除(抹杀)一个文件。
  • 对于不会阻塞 xCode 项目中文件的内容(带有“@”符号的图像):svn st | grep '^!' | awk '{打印 $2}' | xargs -I 文件 svn 删除文件@
  • 这不适用于带有空格和特殊字符的文件。 anton_rh 的回答确实如此。
【解决方案2】:

如何添加你可以简单地使用

svn add --force .

或

svn --force add .

它会做同样的事情:添加所有未版本控制的文件,除了匹配 svn:ignore 模式的文件

【讨论】:

    【解决方案3】:

    我也找到了另一种解决方案。

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

    我在http://donunix.blogspot.de/2009/02/svn-remove-all-deleted-files.html看到过

    【讨论】:

    • !惊人的。专门解决了我的空间名称问题。
    • 很棒的脚本。也适用于空格
    【解决方案4】:

    使用 perl oneliner 的方法是:

    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

      【讨论】:

      • 仅供参考,xargs 的 -d 选项在 OS X 上不受支持 - 所以似乎只适用于 Linux(或者我错过了什么?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2011-08-26
      • 2011-08-25
      • 2012-06-27
      • 2010-11-27
      相关资源
      最近更新 更多