SVN命令删除所有本地丢失的文件

在SVN有一个命令,我可以用来删除目录中的所有本地丢失的文件?

或者做不到这一点,只能列出那些丢失的文件(或者更一般的情况下,有状态A,D,?等)

如果您正在使用TortoiseSVN,只需执行检查修改 ,按状态列sorting,select标记为missing所有条目,右键单击以打开上下文菜单,然后select删除 。 最后,提交将更改发布到存储库。

如果你在Windows上,但更喜欢使用命令行,并且喜欢在PowerShell中进行游戏,那么这一行就可以做到:

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

也就是说,将输出过滤为仅显示缺less文件的行(在行首以惊叹号表示),捕获关联的文件名,然后对该文件名执行svn rm

(博客文章从SVN工作副本删除所有“丢失的”文件在 Unix / Linux上做类似的工作

如果您使用的是Mac( Darwin )或Linux,则可以将以下命令的输出传送给svn rm以查找所有丢失的文件。 在运行这些目录或子目录之前,您可以将当前的工作目录设置为相应的目录或子目录,具体取决于您是要运行整个工作副本还是只运行一个子集。

  1. 运行一个svn状态
  2. search以“!”开头的行 (失踪)
  3. 打印来自#2的输出的“–force”(svn参数)和第二列(文件名)
  4. 使用#3的输出作为参数运行svn rm

所以完整的命令是:

 svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm 

参考文献:

  • 用awk检查字段(列)
  • 使用xargs运行带有参数的shell命令
 svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm 
  1. svn status
  2. 仅过滤丢失的文件
  3. 切出感叹号
  4. 过滤掉尾随的空格
  5. 添加领先的报价
  6. 添加尾随报价
  7. svn remove每个文件

我刚刚发现这个,这是诀窍, 从SVN工作副本中删除所有“丢失”的文件 :

 svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' ) 

感谢Paul Martin为Windows版本。

这是对脚本的一个小的修改,所以Windows文件和空格也被考虑在内。 另外missing.list文件将在最后被删除。

我将svndel.bat中的以下内容保存在我的SVN bin目录中(在我的%% PATH环境中设置),以便可以从命令提示符处的任何文件夹调用它。

 ### svndel.bat svn status | findstr /R "^!" > missing.list for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A") del missing.list 2>NUL 

我喜欢PowerShell选项…但是如果您使用Windows批处理脚本,这里还有另外一个选项:

 svn status | findstr /R "^!" > missing.list for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A) 

在Linux(bash)上可用的替代方法,用于删除不包含path中的空格的文件:

  svn删除`svn status |  grep!  |  awk'{print $ 2}'` 

这个shell脚本recursion地检查项目中的( svn status )目录,删除丢失的文件(如问题所要求的) 并将新的文件添加到存储库中。 这是某种“将项目的当前快照存储到存储库”。

 if [ $# != 1 ] then echo "usage: doSVNsnapshot.sh DIR" exit 0 fi ROOT=$1 for i in `find ${ROOT} -type d \! -path "*.svn*" ` do echo echo "--------------------------" ( cd $i ; echo $i echo "--------------------------" svn status | awk ' /^[!]/ { system("svn rm " $2) } /^[?]/ { system("svn add " $2) } ' ) echo done 

处理大量文件时,可能会发生xargs的参数input过长。 在这种情况下,我去了一个更天真的实现。

这是针对Linux的:

 #! /bin/bash # 1. get all statii in the working copy # 2. filter out only missing files # 3. cut off the status indicator (!) and only return filepaths MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}') # iterate over filepaths for MISSING_PATH in $MISSING_PATHS; do echo $MISSING_PATH svn rm --force "$MISSING_PATH" done 

稍微修改一下命令行,这个命令行可以在Mac OS上运行(希望在Linux上也是如此),并且处理命令“svm sr”报告的文件,比如“!M”(丢失和修改)。

它处理文件中的空格。

它基于以前的答案的修改:

 svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm 

它实际上可以完全删除user3689460和Paul Martin的missing.list

 for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")