Answers:
如果您使用的是TortoiseSVN,只需执行“ 检查修改”,按“ 状态”列排序,选择所有标记的条目missing
,右键单击以打开上下文菜单,然后选择“ 删除”。最后,承诺将更改发布到存储库。
如果您使用的是Windows,但更喜欢使用命令行并喜欢在PowerShell中进行尝试,则此一线式可以解决问题:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
也就是说,仅将输出过滤到那些显示缺少文件的行(在行的开头以感叹号表示),捕获关联的文件名,然后svn rm
对该文件名执行操作。
(博客文章从SVN工作副本中删除所有“丢失的”文件,对于Unix / Linux来说也是如此。)
svn up
吗?因为这些文件是从SVN服务器恢复
如果您使用的是Mac(Darwin)或Linux,则可以将以下命令的输出传递svn rm
给所有丢失的文件。您可以在运行它们之前将当前工作目录设置为适当的目录或子目录-取决于您是要运行整个工作副本还是仅运行其一部分。
svn rm
使用#3作为参数输出因此,完整的命令是:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
参考文献:
awk '{print " --force "$2"@"}'
,如果你的文件名包含@
(如果您是iOS开发为例)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
应做到这一点(并且看起来很丑)
--force
放入xargs部分?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
每个文件-r
的xargs
选项(不运行,如果也没有给出参数)。另外,参数的数量应受到限制,删除操作应分批进行,因为调用失败并需要删除大量文件,例如 -n 500
。最后但并非最不重要的一点是,对于包含特殊shell之类的文件,执行的报价不是最佳选择$
-更好地\n
用作分隔符,并将报价留给xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
我刚刚找到了,这可以解决问题,从SVN工作副本中删除所有“丢失”的文件:
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
感谢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
del missing.list 2>NUL
,因为在第一次删除已删除的文件之后,我直接添加了所有新文件,因此将其添加missing.list
到svn:svn delete "missing.list"
对我
这个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
实际上可以完全missing.list
从user3689460和Paul Martin中删除
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
当处理大量文件时,可能会出现输入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