146

如果我有一个 Subversion 存储库的工作副本,是否可以使用单个命令或工具删除该工作副本中的所有未版本控制或忽略的文件?本质上,我正在寻找与git clean.

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

4

12 回答 12

145

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

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

于 2015-08-19T17:59:14.733 回答
143
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

它具有以下特点:

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

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

#!/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
于 2012-02-04T22:03:59.347 回答
102

使用 TortoiseSVN:

于 2010-05-11T13:57:34.337 回答
43

这个 oneliner 可能会帮助您:

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

小心使用!

于 2010-05-10T15:21:57.727 回答
15

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

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

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

于 2012-09-12T04:27:04.713 回答
8

使用 powershell:

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

从命令行:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
于 2012-07-04T22:02:03.187 回答
8

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

TortoiseSVN 清理选项

于 2012-06-11T16:47:13.517 回答
6

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

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
于 2012-07-11T09:09:10.493 回答
5

使用 TortoiseSVN:

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

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

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

于 2010-05-10T15:29:37.783 回答
4

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

于 2014-10-17T15:03:18.540 回答
4

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

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
于 2010-05-10T15:26:59.110 回答
1

如果您在 linux 系统下,您不能仅使用 SVN 命令行(但不确定 GUI 工具)来删除它们,这可能会有所帮助:

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

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

于 2010-05-10T15:23:16.233 回答