有没有人知道一种递归删除工作副本中不受版本控制的所有文件的方法?(我需要这样才能在自动构建VMware中获得更可靠的结果.)
这在bash中对我有用:
svn status | egrep '^\?' | cut -c8- | xargs rm
赛斯里诺的表现更好:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
它处理文件名中的无版本文件夹和空格
根据下面的评论,这仅适用于subversion不知道的文件(status =?).subversion 确实知道的任何内容(包括忽略的文件/文件夹)都不会被删除.
如果您使用的是subversion 1.9或更高版本,则只需使用带有--remove-unversioned和--remove-ignored选项的svn cleanup命令即可
我试图做同样的事情时跑过这个页面,但不是为了自动构建.
看了一会儿后,我在TortoiseSVN中发现了" 扩展上下文菜单 ".按住shift键并右键单击工作副本.TortoiseSVN菜单下现在还有其他选项,包括" 删除无版本项目...... ".
虽然可能不适用于这个特定的问题(即在自动构建的上下文中),但我认为对于那些希望做同样事情的人来说可能会有所帮助.
编辑:
Subversion 1.9.0引入了一个选项来执行此操作:
svn cleanup --remove-unversioned
在此之前,我使用这个python脚本来做到这一点:
import os
import re
def removeall(path):
if not os.path.isdir(path):
os.remove(path)
return
files=os.listdir(path)
for x in files:
fullpath=os.path.join(path, x)
if os.path.isfile(fullpath):
os.remove(fullpath)
elif os.path.isdir(fullpath):
removeall(fullpath)
os.rmdir(path)
unversionedRex = re.compile('^ ?[\?ID] *[1-9 ]*[a-zA-Z]* +(.*)')
for l in os.popen('svn status --no-ignore -v').readlines():
match = unversionedRex.match(l)
if match: removeall(match.group(1))
它似乎做得很好.
见:svn-clean
如果你在Windows命令行,
for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
改良版:
for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
如果在批处理文件中使用它,则需要加倍%
:
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
我将此添加到我的windows powershell配置文件中
function svnclean { svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } } }
Linux命令行:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
或者,如果您的某些文件归root所有:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
这是基于Ken的回答.(肯的答案会跳过忽略的文件;我的答案会删除它们).