我如何删除我的工作副本中的所有未版本化/忽略的文件/文件夹?

如果我有一个Subversion版本库的工作副本,有没有办法使用单个命令或工具删除该工作副本中所有未版本控制或忽略的文件? 基本上,我正在寻找SVN模拟git clean

命令行或GUI解决scheme(对于TortoiseSVN)都是可以接受的。

使用TortoiseSVN:

  • 右键单击工作副本文件夹, 同时按住shift键
  • select“删除未版本化的项目”
 svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -rf; do rm -rf "$f"; done 

这具有以下特点:

  • 忽略和未跟踪的文件都被删除
  • 它可以工作,即使文件名包含空格(除了换行符,但除了使用--xml选项并parsing生成的xml输出外,没有什么可以做的)
  • 它工作,即使svn status打印文件名之前的其他状态字符(它不应该因为没有跟踪文件,但以防万一…)
  • 它应该在任何符合POSIX的系统上工作

我使用了一个名为svnclean的shell脚本,它包含以下内容:

 #!/bin/sh # make sure this script exits with a non-zero return value if the # current directory is not in a svn working directory svn info >/dev/null || exit 1 svn status --no-ignore | grep '^[I?]' | cut -c 9- | # setting IFS to the empty string ensures that any leading or # trailing whitespace is not trimmed from the filename while IFS= read -rf; do # tell the user which file is being deleted. use printf # instead of echo because different implementations of echo do # different things if the arguments begin with hyphens or # contain backslashes; the behavior of printf is consistent printf '%s\n' "Deleting ${f}..." # if rm -rf can't delete the file, something is wrong so bail rm -rf "${f}" || exit 1 done 

我知道这是旧的,但如果其他人绊倒它,新版本(1.9或更高版本)svn支持 – --remove-unversioned ,例如svn cleanup . --remove-unversioned svn cleanup . --remove-unversioned

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

这个oneliner可能会帮助你:

 $ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf 

小心使用!

使用Powershell修改Yanal-Yves Fargialla和gimpf的答案(但不允许通过Stackoverflow评论原始post):

 powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force} 

这增加了克拉(“^”)指定行的开始,避免匹配包含字母“我”的所有文件。 还要将-recurse和-force的标志添加到rm中,以使此命令为非交互式,并在脚本中可用。

SVN中的许多事情可以通过不同的方式来完成,如这里给出的各种命令行回答所certificate的。 随着1.7版本的出现,TortoiseSVN还有另外一种技术,实际上,它提供了比Stefan提供的答案更精细的颗粒分辨率,让您从忽略的文件中select非版本化的文件。 只要selectTortoiseSvn >> Clean up...来打开这个对话框。

TortoiseSVN清理选项

使用PowerShell:

 (svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm 

从命令行:

 powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}" 

使用TortoiseSVN:

  1. 右键单击工作副本的根目录并selectTortoiseSVN – >“检查修改”
  2. select“显示忽略的文件”
  3. 按“文本状态”列sorting
  4. 滚动到“非版本”文件,现在全部分组在一起; 全部选中并右键单击 – >删除
  5. 滚动到“忽略”文件,现在全部分组在一起; 全部选中并右键单击 – >删除

不是一个很好,干净的解决scheme,但我知道的最快的方法(在Windows上)。

感谢pkh的提示与忽略的文件。

这个oneliner为我工作(根据理查德汉森的答案,这惊人地不适用于包含空格的文件):

 svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {} 

这与其他答案类似,但实际上被忽略的文件(注意RE中的'I'):

  rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'` 

有人说你不能从Windows的命令行。

公牛。

 for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I") 

它在一行中,并不需要一个单一的GNU工具。 🙂

你不能用SVN命令行删除它们(不知道有关GUI工具),如果你是在Linux系统下,这可能会有所帮助:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

另一种(粗暴的)方法是提交更改,从文件夹中删除所有文件并重新签出。