svn删除已删除的文件

时间:2012-06-16 19:11:47

标签: svn

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

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

4 个答案:

答案 0 :(得分:63)

使用

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"

作为旁注:我可以使用文件名中支持空格/ @的变体来复制代码片段。

但是为什么要在SCM存储库中的Linux上创建这样的文件? 建议不要在Linux上的目录/文件名中放置空格。

管理此类文件的每个代码段都过于复杂,只是因为您想要一个“”而不是“_”。

答案 1 :(得分:6)

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

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

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

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

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

2012.06.19每个Don的评论澄清

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

答案 2 :(得分:1)

当您将一堆文件传递到其中包含文件名的路径目录时,以下工作正常。它适用于OSX,IOS和Linux

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

答案 3 :(得分:0)

即使@above answer中提到的文件名中的空格也可以使用。

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

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

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

exit code 1