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


133

在SVN中,有一条命令可以删除目录中所有本地丢失的文件吗?

否则,将只列出那些丢失的文件(或者在更一般的情况下,其状态为A,D 、?等)的某种方式


1
我维护1个工作文件夹和1个结帐文件夹。并且仅将文件从工作文件夹移动到检出文件夹。如果必须添加/删除文件夹,我会手动进行操作,然后将文件移动到该文件夹​​中(例如,新软件包,旧软件包)。当您在工作副本上移动文件夹时,大多数svn问题都会发生。即使将文件从工作副本复制到签出副本,也应仅移动文件,而不移动文件夹。
Siddharth 2012年

Answers:


99

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

如果您使用的是Windows,但更喜欢使用命令行并喜欢在PowerShell中进行尝试,则此一线式可以解决问题:

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

也就是说,仅将输出过滤到那些显示缺少文件的行(在行的开头以感叹号表示),捕获关联的文件名,然后svn rm对该文件名执行操作。

(博客文章从SVN工作副本删除所有“丢失的”文件,对于Unix / Linux来说也是如此。)


使用subclipse插件在Eclipse中有办法吗?更新a然后在项目中找到它们并再次删除它们是非常糟糕的。
斯坦2014年

仅供参考,如果需要使用颠覆密码,则语法如下:svn status --username user_name_here --password password_here | ?{$ _ -match'^!\ s +(。*)'} | %{svn rm $ Matches [1] --username user_name_here--password password_here}
Jeff

您应该在执行此行之后首先提交svn up吗?因为这些文件是从SVN服务器恢复
皮埃尔·

此操作也会从存储库中删除文件吗?
塞巴斯蒂安·乌洛阿

175

如果您使用的是Mac(Darwin)或Linux,则可以将以下命令的输出传递svn rm给所有丢失的文件。您可以在运行它们之前将当前工作目录设置为适当的目录或子目录-取决于您是要运行整个工作副本还是仅运行其一部分。

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

因此,完整的命令是:

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

参考文献:


4
如果文件名中有空格,则此方法不起作用。我不知道足够多的awk来修复它。
bugloaf 2013年

2
使用awk '{print " --force "$2"@"}',如果你的文件名包含@(如果您是iOS开发为例)
纪尧姆阿尔吉斯

1
并使用空格处理文件名,awk '{$1=""; print " --force \""substr($0,2)"@\"" }'应做到这一点(并且看起来很丑)
Guillaume Algis

12
占用空间的完整命令是“ svn st | grep ^!| awk'{$ 1 =”“; print” --force \“” substr($ 0,2)“ @ \”“}'| xargs svn rm “
HelloWorld

1
您为什么不将--force放入xargs部分?
jwg

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

如果文件/目录中有空格,则此解决方案有效。
yuric

如何增加冗长呢?xargs -verbose svn rm吗?
TekiusFanatikus

1
只是对脚本用户的提示,如果找不到要删除的文件,此命令将失败:svn:E205001:尝试“ svn帮助删除”以获取更多信息svn:E205001:没有提供足够的参数
ThorstenSchöning,

1
@ThorstenSchöning的问题可以通过增加固定-rxargs选项(不运行,如果也没有给出参数)。另外,参数的数量应受到限制,删除操作应分批进行,因为调用失败并需要删除大量文件,例如 -n 500。最后但并非最不重要的一点是,对于包含特殊shell之类的文件,执行的报价不是最佳选择$-更好地\n用作分隔符,并将报价留给xargssvn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

感谢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

很高兴看到一些创新的批处理代码仍在出现:)
user230910

哇,好答案。我本来打算使用powershell,但这要容易得多。
Jim Andrakakis

我在之后添加了另一行del missing.list 2>NUL,因为在第一次删除已删除的文件之后,我直接添加了所有新文件,因此将其添加missing.list到svn:svn delete "missing.list"对我
Pierre

我已修改此脚本以尝试从任意位置运行,然后遇到此问题stackoverflow.com/questions/1137219/…因此看来您必须使用当前工作目录来执行此操作。
aolszowka,

7

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

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

5

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

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

4

这个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

4

对该命令行进行了少许修改,即可在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

4

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

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

供参考-这是Windows环境中的DOS / cmd.exe
user230910

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

1

改进版

因此,完整的命令是:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.