46

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

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

4

4 回答 4

82

使用

svn status

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

那么你也能 :

svn delete file_to_del1 file_to_del2 etc

最后提交

您还可以编写一个小片段来自动执行此操作:

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 删除
}
于 2012-06-16T19:21:11.647 回答
7

您所说的问题(我可以通过某种方式告诉 SVN 删除(从存储库中)工作副本中缺少的任何文件吗?)实际上是相关问题svn command to delete all local missing files的副本。为了回答这个问题,我提供了一个单行 PowerShell 脚本,让您可以自动识别并从存储库中删除必要的文件。为了方便起见,我在这里复制它:

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

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

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

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

2012.06.19 根据 Don 的评论进行澄清

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

于 2012-06-18T00:34:15.060 回答
1

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

svn st | grep ^! | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn rm
于 2018-05-08T15:55:54.230 回答
0

这甚至适用于上述答案@中提到的文件名中的和空格。

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

为什么?它获取可删除文件的列表并逐行传递到svn delete. 在此处了解更多关于xargs带牙套的信息。

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

(svn status | grep "^!" | cut -c2- | xargs -i{} svn delete "{}") || :
于 2020-04-16T16:36:11.613 回答