Svn 删除删除的文件

Svn 删除删除的文件,svn,Svn,我有一个SVN项目的工作副本。应用程序将从此工作副本中删除文件。当我使用SVN命令行提交工作副本时,我希望从存储库中删除这些已删除的文件 如果我使用svn commit提交工作副本,它不会从项目中删除文件(因为它们不是使用svn delete在本地删除的。是否有某种方法可以让svn删除(从存储库中)工作副本中丢失的任何文件?使用 svn status 它将列出工作副本的更改。(已删除的文件以开头!) 然后,您可以: svn delete file_to_del1 file_to_del2 et

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

如果我使用
svn commit
提交工作副本,它不会从项目中删除文件(因为它们不是使用
svn delete
在本地删除的。是否有某种方法可以让svn删除(从存储库中)工作副本中丢失的任何文件?

使用

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=""; print " --force \""substr($0,2)"@\"" }' | xargs svn delete } svn_prepare_del(){ svn st|grep'^!| awk'{$1=”“;print”--force\''substr($0,2)@\'}xargs svn删除 } 您的问题的措辞(我是否可以告诉SVN(从存储库中)删除工作副本中丢失的任何文件?)实际上是相关问题的重复。为了回答该问题,我提供了一行PowerShell脚本,让您可以自动识别并从存储库中删除所需的文件。为了方便起见,我在此处复制它:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
当然,这假设您在Windows上。如果您在Linux/Unix上,这是一个类似的解决方案

然而,当你加入问题的第二部分,你无意中透露:-)在后来的评论中-,有没有一种方法可以在提交时自动发生这种情况?那么你的问题是独一无二的

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

2012.06.19根据Don的评论进行澄清


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

当您收到一堆文件或包含文件名的路径目录时,以下方法有效。它将在OSX、IOS和linux上工作

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

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

svn status | grep“^!”| cut-c2-| xargs-i{}svn delete“{}”
为什么??它获取可删除文件的列表,并逐行传递给
svn delete
。了解有关带大括号的
xargs
的更多信息

编辑:如果在CI/CD(例如GitLab CI)中使用上述命令,则需要确保忽略错误,因为如果未找到匹配项,
grep
将返回一个
退出代码1

(svn状态| grep“^!”| cut-c2-| xargs-i{}svn删除“{}”)|

如果应用程序删除了这些文件,那么它们可能不应该首先在存储库中?也许您应该使用
svn propset svn:ignore
no将它们排除在存储库中,直到它们被删除。关键是存储库要存储它们,这样,如果您想返回到以前的版本,就可以恢复它们。您必须告诉它,这些文件需要在新文件中标记为已删除version@D最后,请接受回答谢谢,但我希望我能提供一些选项来
svn commit
自动完成这项工作这正是我所需要的,所有+1!如果删除的文件名称中有空格,则“自动剪切”不起作用。下面是一个固定的名称(它还修复了@in filename的问题):
svn st|grep'^!'awk“{$1=”“;print”-force\''substr($0,2)”@\'}| xargs svn delete不直接属于这里,但由于我只是花了一些时间来了解如何正确地转义别名的最后一个:改用函数:-svn_precommit(){svn st |…}AFAIK,预提交挂钩在服务器上运行,所以我看不出它们有什么帮助