当前位置:  开发笔记 > 编程语言 > 正文

自动删除Subversion无版本文件

如何解决《自动删除Subversion无版本文件》经验,为你挑选了7个好方法。

有没有人知道一种递归删除工作副本中不受版本控制的所有文件的方法?(我需要这样才能在自动构建VMware中获得更可靠的结果.)



1> Ken..:

这在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命令即可


您可以考虑将-d选项添加到xargs以获取带空格的文件名,并将-r选项添加到rm以用于任何添加的目录:svn status | grep ^ \?| 切-c9- | xargs -d \\n rm -r
也可以在cygwin的Windows中使用.
我也遇到了在OS X上运行的-d选项的问题,我的替代方案如下,它将换行符转换为空字符并在xargs上使用-0选项来处理文件名中的空格:svn status | grep ^ \?| 切-c9- | tr'\n''\ 0'| xargs -0 rm
如果你对依赖于另一个命令输出中确切字符数的命令不满意:`svn status | grep"^?" | awk'{print $ 2}'| xargs -d \\n rm -r`
@Pavel看看xargs --no-run-if-empty选项

2> g ...:

我试图做同样的事情时跑过这个页面,但不是为了自动构建.

看了一会儿后,我在TortoiseSVN中发现了" 扩展上下文菜单 ".按住shift键并右键单击工作副本.TortoiseSVN菜单下现在还有其他选项,包括" 删除无版本项目...... ".

虽然可能不适用于这个特定的问题(即在自动构建的上下文中),但我认为对于那些希望做同样事情的人来说可能会有所帮助.



3> Thomas Watne..:

编辑:

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

它似乎做得很好.



4> Martin..:

见:svn-clean



5> 小智..:

如果你在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"



6> Kyle..:

我将此添加到我的windows powershell配置文件中

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}


@FelipeAlvarez是的.是的,我们这样做.这不是自切片面包以来最伟大的事情,但它击败批次.我说它至少和bash一样有用,可能会更多,因为你可以引入.NET程序集.

7> user9876..:

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的回答.(肯的答案会跳过忽略的文件;我的答案会删除它们).

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有