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

Nic*_*yer 133 svn tortoisesvn ignore

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

命令行或GUI解决方案(对于TortoiseSVN)都是可以接受的.

Ric*_*sen 131

svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done
Run Code Online (Sandbox Code Playgroud)

这具有以下功能:

  • 删除已忽略和未跟踪的文件
  • 即使文件名包含空格,它仍然有效(除换行之外,除了使用该--xml选项并解析生成的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 -r f; 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
Run Code Online (Sandbox Code Playgroud)

  • @matrixugly:不,你不需要将`IFS'改回原来的状态.当你执行`VARNAME = value command`时,`value`到`VARNAME`的赋值仅适用于`command`的执行(有些例外不适用于`read`).请参阅[POSIX规范](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09)和[此POSIX错误报告](http://austingroupbugs.net/view.php?id = 654#c1559)了解更多详情. (3认同)
  • 正是我所寻找的,就像在linux和MacOS上的魅力一样! (2认同)

Nei*_*eil 109

我知道这是旧的,但万一其他人偶然发现它,svn支持的更新版本(1.9或更高版本)--remove-unversioned,例如svn cleanup . --remove-unversioned.

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

  • 对我来说,这是正确的答案.这是一个跨平台的命令行答案.此外,您可以使用`svn cleanup删除被忽略的文件.--remove-ignored` (18认同)
  • 请将其更改为1.9,另请参阅https://subversion.apache.org/docs/release-notes/1.9.html(我在本地尝试过,但没有用,我使用的是1.8.8) (2认同)
  • 似乎问题是它没有删除未版本化的_folders_. (2认同)

Ste*_*fan 97

使用TortoiseSVN:

  • 不错的功能!不过,我必须阅读链接,才能发现它只适用于XP上的列表视图(而不是树视图) - 也许你应该在答案中包含它. (7认同)
  • svn的命令行版本(特别是在Windows上)不提供相同的功能吗? (5认同)
  • 正如有人在下面指出的:“svn cleanup --remove-unversioned --remove-ignored”。 (5认同)

jkr*_*mer 41

这个oneliner可能会帮助你:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

小心使用!

  • 这不会删除被忽略的文件,如果文件名包含空格,则会中断 (13认同)
  • 您可以使用`svn status --no-ignore`来捕获被忽略的文件. (4认同)
  • 事实上,我认为将一个被忽略的文件保留在原位是一个功能. (3认同)

小智 15

使用Powershell修改Yanal-Yves Fargialla和gimpf的答案(但不允许对Stackoverflow的原始帖子发表评论):

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

这会添加克拉("^")以指定行的开头,从而避免匹配包含字母"i"的所有文件.还要将-recurse和-force的标志添加到rm,以使此命令非交互式,因此可以在脚本中使用.


Mic*_*ens 7

SVN中的许多内容可以通过不同的方式完成,这可以通过这里给出的各种命令行答案来证明.随着版本1.7的出现,TortoiseSVN的另一种技术实际上提供了比Stefan提供的答案更精细的粒度分辨率,让您可以单独从被忽略的文件中选择非版本化文件.只需选择TortoiseSvn >> Clean up...打开此对话框即可.

TortoiseSVN清理选项


Yan*_*lla 7

使用powershell:

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

从命令行:

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

  • 我喜欢这个纯Windows脚本!我建议使用`-match'[\?i]'-replace'^.{8}'`,即使文件_starts_带有空格也能正常工作,并且还删除被忽略的文件. (3认同)

Den*_*zov 6

这个oneliner适用于我(基于Richard Hansen的答案,令人惊讶的是它不适用于包含空格的文件):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
Run Code Online (Sandbox Code Playgroud)

  • 要也删除未版本控制的文件夹,请将`-fr`添加到`rm`命令中:svn status --no-ignore | grep'^ [I?]'| 切-c 9- | xargs -d“ \ n” -I {} rm -fr {} (2认同)

Tho*_*zer 5

使用TortoiseSVN:

  1. 右键单击工作副本的根目录,然后选择TortoiseSVN - >"检查修改"
  2. 选择"显示忽略的文件"
  3. 按"文本状态"列排序
  4. 滚动到"非版本化"文件,现在全部组合在一起; 选择它们全部并右键单击 - >删除
  5. 滚动到"忽略"文件,现在全部组合在一起; 选择它们全部并右键单击 - >删除

这不是一个很好的和干净的解决方案,但我知道的最快的方式(在Windows上).

感谢pkh提示被忽略的文件.

  • 您不需要使用提交对话框,您可以获取被忽略的文件:右键单击| TortoiseSVN | 检查修改.然后,您可以单击"显示忽略的文件"并进行适当的排序/删除. (2认同)