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

whe*_*hys 124 svn file-io

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

或者失败了,某种方式只列出那些丢失的文件(或者,在更一般的情况下,具有状态A,D,?等)

Pet*_*tai 167

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

  1. 运行svn状态
  2. 搜索以"!"开头的行 (失踪)
  3. 打印#force输出的"--force"(svn参数)和第二列(文件名)
  4. 运行svn rm使用#3作为参数输出

所以完整的命令是:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • 处理空间的完整命令是"svn st | grep ^!| awk'{$ 1 =""; print"--force \""substr($ 0,2)"@ \""}'| xargs svn rm " (11认同)
  • 为什么不把 `--force` 放到 xargs 部分? (4认同)
  • 如果文件名中有空格,则不起作用.但是,我不知道要解决它的问题. (3认同)
  • 使用`awk'{print"--force"$ 2"@"}'`如果您的文件名包含`@`(例如,如果您是iOS开发者) (2认同)

Mic*_*ens 94

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

如果您使用的是Windows,但更喜欢命令行并喜欢在PowerShell中使用,那么这个单线程就能解决问题:

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

也就是说,将输出过滤为仅显示缺少文件的行(由行开头的感叹号表示),捕获关联的文件名,并svn rm对该文件名执行操作.

(博客文章从SVN工作副本删除所有"丢失"文件对Unix/Linux执行类似操作.)

  • SVN默认不支持这个命令吗? (25认同)

ivr*_*rin 50

svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
Run Code Online (Sandbox Code Playgroud)
  1. svn status
  2. 仅过滤丢失的文件
  3. 切出感叹号
  4. 过滤掉尾随空格
  5. 添加引号
  6. 添加尾随报价
  7. svn remove 每个文件

  • @ThorstenSchöning 的问题可以通过在“xargs”选项中添加“-r”来解决(如果没有给出参数,则不要运行)。此外,应该限制参数的数量,并且应该批量删除,因为调用会失败并删除大量文件,例如“-n 500”。最后但并非最不重要的一点是,对于包含 shell 特殊字符(例如“$”)的文件,所执行的引用并不是最优的 - 最好使用“\n”作为分隔符并将引用保留为“xargs”:“svn status | ” 查找“!” | 切-d!-f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm` (2认同)

whe*_*hys 29

我刚刚找到了这个,它可以解决这个问题,从SVN工作副本中删除所有"丢失"的文件:

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
Run Code Online (Sandbox Code Playgroud)

  • 如果文件/目录中有空格,则不起作用 (4认同)

小智 15

感谢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
Run Code Online (Sandbox Code Playgroud)


Amf*_*sis 7

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

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


小智 6

我喜欢PowerShell选项...但是如果您使用的是Windows批处理脚本,这是另一个选项:

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


小智 6

一种适用于 Linux (bash) 的替代方法,用于删除路径中不包含空格的文件:

svn 删除`svn 状态| 格雷普!| awk '{print $2}'`


cib*_*en1 5

这个 shell 脚本递归地检查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
Run Code Online (Sandbox Code Playgroud)


小智 5

命令行的轻微修改,它适用于 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
Run Code Online (Sandbox Code Playgroud)