[英]SVN command to delete all locally missing files
在SVN中是否有一个命令我可以用来删除目录中所有本地丢失的文件?
或者失败了,某种方式只列出那些丢失的文件(或者,在更一般的情况下,具有状态A,D,?等)
如果您使用的是Mac( Darwin )或Linux,则可以将以下命令的输出通过管道传输到svn rm
以查找所有丢失的文件。 您可以在运行这些目录之前将当前工作目录设置为相应的目录或子目录 - 这取决于您是要运行整个工作副本还是仅运行子集。
svn rm
所以完整的命令是:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
参考文献:
如果您正在使用TortoiseSVN,只需执行检查修改 ,按状态列排序,选择标记为missing
所有条目,右键单击以打开上下文菜单,然后选择删除 。 最后,提交将更改发布到存储库。
如果您使用的是Windows,但更喜欢命令行并喜欢在PowerShell中使用,那么这个单线程就能解决问题:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
也就是说,将输出过滤为仅显示缺少文件的行(在行的开头用感叹号表示),捕获关联的文件名,并对该文件名执行svn rm
。
(博客文章从SVN工作副本中删除所有“丢失”文件对Unix / Linux执行类似操作。)
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
每个文件 我刚刚找到了这个,它可以解决这个问题, 从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
我喜欢PowerShell选项...但是如果您使用的是Windows批处理脚本,这是另一个选项:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) 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
它实际上是可以完全取出missing.list
从user3689460和保罗·马丁
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
改良版
所以完整的命令是:
svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.