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

时间:2012-03-07 11:12:42

标签: svn file-io

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

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

12 个答案:

答案 0 :(得分:162)

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

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

    所以完整的命令是:

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

    <强>参考文献:

答案 1 :(得分:91)

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

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

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

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

(博客文章 Remove all “missing” files from a SVN working copy 为Unix / Linux做了类似的事情。)

答案 2 :(得分:48)

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每个文件

答案 3 :(得分:29)

我刚刚找到了这个,这就是诀窍Remove all “missing” files from a SVN working copy

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

答案 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

答案 5 :(得分:6)

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

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

答案 6 :(得分:4)

另一种适用于Linux(bash)的替代方案,用于删除路径中没有空格的待删除文件:

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

答案 7 :(得分:3)

此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

答案 8 :(得分:3)

稍微修改命令行,该命令行适用于Mac OS(希望甚至可以在Linux上运行)并且可以处理命令&#34; svm sr&#34;报告,像&#34;!M&#34; (缺失和修改)。

它可以处理文件中的空格。

它基于对先前答案的修改:

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

答案 9 :(得分:3)

实际上可以从user3689460和Paul Martin

中完全删除missing.list
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

答案 10 :(得分:2)

当处理大量文件时,可能会发生输入xargs的参数变得太长。我选择了一个更天真的实现,也适用于那种情况。

这适用于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

答案 11 :(得分:0)

改进版本

因此完整的命令是:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm