如果您使用的是 Mac (Darwin) 或 Linux,您可以将以下命令的输出通过管道传输到 svn rm
,以查找所有丢失的文件。您可以在运行它们之前将当前工作目录设置为适当的目录或子目录 - 取决于您是要运行整个工作副本还是只运行一个子集。
运行 svn status 搜索以“!”开头的行(缺失)打印 #2 输出的“--force”(svn 参数)和第二列(文件名) 使用 #3 的输出作为参数运行 svn rm
所以完整的命令是:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
参考:
使用 awk 检查字段(列)
使用 xargs 运行带参数的 shell 命令
如果您使用的是 TortoiseSVN,只需执行 Check for Modifications,按 Status 列排序,选择所有标记为 missing
的条目,右键单击以打开上下文菜单,然后选择删除。最后,提交以将更改发布到存储库。
如果您在 Windows 上,但更喜欢命令行并喜欢涉足 PowerShell,那么这个单行代码可以解决问题:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
也就是说,将输出过滤到仅显示丢失文件的那些行(由行开头的感叹号表示),捕获关联的文件名,并对该文件名执行 svn rm
。
(博文 Remove all “missing” files from a SVN working copy 为 Unix/Linux 做了类似的事情。)
svn up
之前,您应该先在此行之后提交吗?因为文件是从svn服务器恢复的
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status 仅对丢失的文件进行过滤 删除感叹号 过滤掉尾随空格 添加前导引号 添加尾随引号 svn 删除每个文件
-r
添加到 xargs
选项来解决(如果没有给出参数,请不要运行)。此外,参数的数量应该受到限制,并且应该批量删除,因为调用失败并且要删除的文件数量非常多,例如 -n 500
。最后但并非最不重要的一点是,对于包含诸如 $
之类的 shell 特殊文件的文件,执行的引用不是最佳的 - 最好使用 \n
作为分隔符并将引用保留为 xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
我刚刚找到了这个,它可以解决问题,Remove all “missing” files from a SVN working copy:
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
感谢 Paul Martin 提供 Windows 版本。
这是对脚本的轻微修改,因此也考虑了带有空格的 Windows 文件。最后还将删除 missing.list
文件。
我将以下内容保存在我的 SVN bin 目录中的 svndel.bat 中(在我的 %%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
del missing.list 2>NUL
之后添加了另一行,因为我在第一次删除已删除的文件后直接添加了所有新文件,所以它添加了 missing.list
到 svn:svn delete "missing.list"
为我工作
我喜欢 PowerShell 选项...但如果您使用的是 Windows 批处理脚本,这里还有另一个选项:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
实际上可以从 user3689460 和 Paul Martin 中完全删除 missing.list
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
一种适用于 Linux (bash) 的替代方法,用于在路径中不包含空格的待删除文件:
svn delete `svn status | grep ! | awk '{print $2}'`
此 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
对命令行稍作修改,可在 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
在处理大量文件时,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
改良版
所以完整的命令是:
svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
@
(例如,如果您是 iOS 开发人员),请使用awk '{print " --force "$2"@"}'
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
应该可以解决问题(并且开始看起来很难看)--force
放入 xargs 部分?