【问题标题】:svn delete removed filessvn 删除删除的文件
【发布时间】:2012-06-19 10:41:57
【问题描述】:

我有一个 SVN 项目的工作副本。文件被应用程序从此工作副本中删除。当我使用 SVN 命令行提交工作副本时,我想从存储库中删除这些已删除的文件。

如果我使用 svn commit 提交工作副本,它不会从项目中删除文件(因为它们没有在本地使用 svn delete 删除。有什么方法可以告诉 SVN 删除(从存储库)工作副本中缺少的任何文件?

【问题讨论】:

  • 如果应用程序删除了文件,也许它们一开始就不应该在存储库中?也许您应该使用svn propset svn:ignore 排除它们
  • 不,它们需要在存储库中,直到它们被删除
  • 重点是让存储库存储它们,这样如果你想回到以前的版本,你可以恢复它们。您必须告诉它,这些文件需要在新版本中标记为已删除
  • @Dónal 请接受答案

标签: svn


【解决方案1】:

使用一个

svn status

它将列出工作副本的更改。 (删除的文件以 ! 开头)

那么,你可以:

svn delete file_to_del1 file_to_del2 etc

最后提交

你也可以写一个小sn-p来自动化这个:

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

并最终添加一个别名:

alias svn_precommit="svn status | grep '^!' | awk '{print $2}' | xargs svn delete"

如果您需要在文件名中支持 @ / 空格,则需要使脚本复杂化(您不应在文件名中使用这些字符,但有时这是由其他人做出的决定) - 您可以在 .直接bashrc:

svn_prepare_del() { svn st | grep '^!' | awk '{$1="";打印 " --force \""substr($0,2)"@\"" }' | xargs svn 删除 }

【讨论】:

  • 谢谢,但我希望我可以向svn commit 提供一些选项来自动执行此操作
  • 这正是我所需要的,所有的 +1 !
  • 如果删除的文件名称中包含空格,则自动剪切不起作用。
  • 这是一个固定的(也修复了文件名中@的问题):svn st | grep '^!' | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn delete
  • 不直接属于这里,但是因为我只是花了一些时间来找出如何正确地为别名转义最后一个:改用函数:stackoverflow.com/a/20111135/11357 - svn_precommit() { svn st | ... }
【解决方案2】:

您的问题措辞(有什么方法可以告诉 SVN 删除(从存储库中)工作副本中缺少的任何文件?)实际上是相关问题的重复svn command to delete all locally missing files。为了回答这个问题,我提供了一个单行 PowerShell 脚本,让您可以自动识别并从存储库中删除必要的文件。为了方便,我在这里复制它:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

当然,这假设您使用的是 Windows。如果您使用的是 Linux/Unix,Here 是一个类似的解决方案。

但是,当您添加问题的第二部分时,您无意中在稍后的评论中透露了 :-)--有没有办法在提交时自动发生这种情况?--那么你的问题是独一无二的。

我可以看到回答第二部分的唯一途径是使用 pre-commit 钩子,即在启动提交时但在提交本身实际发生之前执行的 hook script。通常,您将使用预提交挂钩来验证某些条件,并允许提交继续或终止。唉,我认为在提交本身期间修改正在提交的文件集是不允许的,更不用说可取了。但我没有发现这一点记录在案,所以你可能想进一步挖掘这一点。

2012.06.19 根据 Don 的评论进行澄清

Don 是正确的,您需要 client 端的钩子,而不是 服务器 端的钩子,因为要处理的已删除文件在客户端上。命令行 svn 没有这个选项,但 TortoiseSVN 提供client-side hooks。事实上,在我阅读了参考手册页后,我被提醒说 TortoiseSVN 不仅提供了 pre-commit 钩子,而且还提供了 start-commit 钩子,它非常适合这种情况。不同之处在于 pre-commit 钩子在您打开提交对话框之后运行 并且在您按下 OK 以尝试执行提交之后 运行。另一方面,start-commit 钩子在提交对话框打开之前运行。因此,有了钩子脚本,当您看到要提交的文件列表时,它也会包含要删除的文件!

【讨论】:

  • AFAIK,预提交挂钩在服务器上运行,所以我看不出它们有什么帮助
【解决方案3】:

当您收到一堆文件或其中包含文件名的路径目录时,以下工作。它适用于 OSX、IOS 和 linux

svn st | grep ^! | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn rm

【讨论】:

    【解决方案4】:

    这甚至适用于@above answer 中提到的文件名中的空格。

    svn status | grep "^!" | cut -c2- | xargs -i{} svn delete "{}"
    

    为什么?它获取可删除文件的列表并逐行传递给svn delete。详细了解 xargs 和大括号 here

    编辑:如果您在 CI/CD(例如 GitLab CI)中使用上述命令,则需要确保忽略错误,因为如果没有,grep 将返回 exit code 1找到匹配项:

    (svn status | grep "^!" | cut -c2- | xargs -i{} svn delete "{}") || :
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多