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以查找所有丢失的文件。 在运行这些目录或子目录之前,您可以将当前的工作目录设置为相应的目录或子目录,具体取决于您是要运行整个工作副本还是只运行一个子集。 
- 运行一个svn状态
- search以“!”开头的行 (失踪)
- 打印来自#2的输出的“–force”(svn参数)和第二列(文件名)
-  使用#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 
-  svn status
- 仅过滤丢失的文件
- 切出感叹号
- 过滤掉尾随的空格
- 添加领先的报价
- 添加尾随报价
-   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")