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

如果我有一个 Subversion 存储库的工作副本,是否有办法用一个命令或工具删除该工作副本中所有未版本化或忽略的文件?本质上,我在寻找类似于 git clean的 SVN。

可以使用命令行或 GUI 解决方案(对于 TortoiseSVN)。

91924 次浏览

下面这句话可能会对你有所帮助:

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

小心使用!

如果你在 linux 系统下,你不能用 SVN 命令行删除它们(虽然不确定 GUI 工具) ,这可能会有帮助:

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

另一种(残酷的)方法是提交更改,从文件夹中删除所有内容,然后再次签出。

这与其他答案类似,但实际上会被忽略(注意 REs 中的“ I”) :

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

使用 TortoiseSVN:

  1. 右键单击工作副本的根目录并选择 TortoiseSVN-> “ check for Amendment”
  2. 选择“显示被忽略的文件”
  3. 按“文本状态”列排序
  4. 滚动到“非版本”文件,现在所有这些文件组合在一起; 选择它们,然后右键单击-> delete
  5. 滚动到“忽略”文件,现在所有文件分组在一起; 选择所有文件,然后右键单击-> delete

这不是一个漂亮干净的解决方案,而是我所知道的(在 Windows 上)最快的解决方案。

感谢 pkh 提供的关于被忽略文件的提示。

使用 TortoiseSVN:

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

它具有以下特点:

  • 忽略和未跟踪的文件都将被删除
  • 即使文件名包含空白(除了换行符,但是除了使用 --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

SVN 中的许多事情可以通过不同的方式完成,这里给出的各种命令行答案就是证明。随着版本1.7的出现,TortoiseSVN 还有另外一种技术,它实际上提供了比 Stefan 的答案更好的粒度分辨率,允许您分别选择非版本化的文件和被忽略的文件。只要选择 TortoiseSvn >> Clean up...打开这个对话框。

TortoiseSVN cleanup options

强力外壳:

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

从命令行:

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

下面这句话对我很有用(基于 Richard Hansen 的回答,令人惊讶的是,对于包含空格的文件并不适用) :

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

使用 Powershell 修改 Yanal-Yves Fargialla 和 gimpf 的回答(但 Stackoverflow 不允许评论原文) :

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

这添加了克拉(“ ^”)来指定行的开头,避免匹配所有包含字母“ i”的文件。还要向 rm 添加-urse 和-force 标志,使该命令不具有交互性,因此可以在脚本中使用。

有人说你不能从 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 工具. :)

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

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