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

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

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

108779 次浏览

我刚发现了这个,很有用:

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

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

如果你使用的是 Windows 操作系统,但更喜欢使用命令行并喜欢涉足 PowerShell,那么下面这句俏皮话就可以解决这个问题:

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

也就是说,只将输出过滤到那些显示缺失文件的行(在行的开头用感叹号表示) ,捕获相关的文件名,并对该文件名执行 svn rm

(Blog post 从 SVN 工作副本中删除所有“丢失”的文件为 Unix/Linux 做了类似的事情。)

如果您正在使用 Mac (达尔文)或 Linux,您可以将以下命令的输出通过管道传输到 svn rm,以获得所有丢失的文件。你可以在运行之前将当前工作目录设置到相应的目录或子目录——这取决于你是想运行整个工作副本,还是只运行一个子集。

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

所以完整的命令是:

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

参考文献:

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

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

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

感谢 Paul Martin 的 Windows 版本。

这里稍微修改了脚本,以便同时考虑带有空格的 Windows 文件。同时,missing.list文件也将在最后被删除。

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

### 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
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

当处理大量文件时,可能会发生 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

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

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

对命令行稍作修改,该命令行可以在 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")

改进版本

所以完整的命令是:

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