自动删除Subversion无版本文件

Ste*_*tze 108 svn build-automation

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

Ken*_*Ken 138

这在bash中对我有用:

 svn status | egrep '^\?' | cut -c8- | xargs rm
Run Code Online (Sandbox Code Playgroud)

赛斯里诺的表现更好:

svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r 
Run Code Online (Sandbox Code Playgroud)

它处理文件名中的无版本文件夹和空格

根据下面的评论,这仅适用于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 (9认同)
  • 也可以在cygwin的Windows中使用. (6认同)
  • 我也遇到了在OS X上运行的-d选项的问题,我的替代方案如下,它将换行符转换为空字符并在xargs上使用-0选项来处理文件名中的空格:svn status | grep ^ \?| 切-c9- | tr'\n''\ 0'| xargs -0 rm (4认同)
  • 如果你对依赖于另一个命令输出中确切字符数的命令不满意:`svn status | grep"^?" | awk'{print $ 2}'| xargs -d \\n rm -r` (3认同)
  • @Pavel看看xargs --no-run-if-empty选项 (3认同)

g .*_*g . 71

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

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

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


Tho*_*dal 24

编辑:

Subversion 1.9.0引入了一个选项来执行此操作:

svn cleanup --remove-unversioned
Run Code Online (Sandbox Code Playgroud)

在此之前,我使用这个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))
Run Code Online (Sandbox Code Playgroud)

它似乎做得很好.


小智 9

如果你在Windows命令行,

for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
Run Code Online (Sandbox Code Playgroud)

改良版:

for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
Run Code Online (Sandbox Code Playgroud)

如果在批处理文件中使用它,则需要加倍%:

for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
Run Code Online (Sandbox Code Playgroud)


Kyl*_*yle 7

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

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

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

use*_*876 5

Linux命令行:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
Run Code Online (Sandbox Code Playgroud)

或者,如果您的某些文件归root所有:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
Run Code Online (Sandbox Code Playgroud)

这是基于Ken的回答.(肯的答案会跳过忽略的文件;我的答案会删除它们).


bru*_*iuz 5

只需在 unix-shell 上执行以下操作:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
Run Code Online (Sandbox Code Playgroud)


Iva*_*kov 5

Subversion 1.9.0 引入了删除未版本化项目的选项 [1]

svn cleanup --remove-unversioned
Run Code Online (Sandbox Code Playgroud)

[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options