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


136

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

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


Answers:


98

使用TortoiseSVN:


7
不错的功能!不过,我不得不阅读链接,以发现它仅适用于XP上的列表视图(而不是树形视图)-也许您应该将其包括在答案中。
尼克·迈耶

5
svn的命令行版本(特别是在Windows上)是否不提供相同的功能?
blong 2012年

3
正如sombody在下面指出的:svn cleanup --remove-unversioned --remove-ignored .
haui

133
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

2
正是我要寻找的东西,在Linux和MacOS上也像魅力一样起作用!
丰富的

您需要重设IFS吗?我选择不制作“ svnclean”脚本。所以我想知道这是否会
破坏

3
@matrixugly:不,您不需要IFS恢复到之前的状态。当您执行时VARNAME=value commandvalueto 的赋值VARNAME仅在执行期间适用command(某些例外不适用于read)。有关更多详细信息,请参见POSIX规范此POSIX错误报告
理查德·汉森

@rich,谢谢分享。几年前开始寻找svn清理解决方案,并且还获得了一些shell脚本知识!显然,我已经回到这个答案很多了。
C. Tewalt

120

我知道这是旧的,但万一其他人迷失了它,可以使用svn支持的新版本(1.9或更高版本)--remove-unversioned,例如svn cleanup . --remove-unversioned

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


18
对我来说,这是正确的答案。这是跨平台的命令行答案。另外,您可以使用svn cleanup . --remove-ignored
Dan Atkinson

1
适用于svn 1.6及更高版本。
挪威

2
请将其更改为1.9,另请参见subversion.apache.org/docs/release-notes/1.9.html(我在本地尝试过,但没有用,我使用的是1.8.8)
ikku100,2016年

2
似乎问题在于它不会删除未版本控制的文件夹
Nyerguds

1
@Nyerguds:是的,这不会删除未版本控制的文件夹,而只会删除未版本控制的文件。有没有人找到解决方案?
dhiraj suvarna '16

41

这个单人可能会帮助您:

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

小心使用!


13
这不会删除被忽略的文件,并且如果文件名包含空格将导致中断
Richard Hansen

1
它还不会删除被忽略的文件
plaisthos 2013年

4
您可以用来svn status --no-ignore很好地捕获被忽略的文件。
Codure

3
实际上,我认为这是一种可选功能,可以将忽略的文件留在原地。
macetw

15

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

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

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


该命令在末尾需要额外的双引号。我只添加它,但是显然编辑必须至少包含六个字符。
伊恩·米勒

7

SVN中的许多事情可以用不同的方式完成,如此处给出的各种命令行答案所证明的。随着1.7版的问世,TortoiseSVN的另一种技术实际上提供了比Stefan所提供答案更好的粒度分辨率,使您可以从忽略的文件中分别选择非版本文件。只需选择TortoiseSvn >> Clean up...打开此对话框。

TortoiseSVN清理选项


7

使用powershell:

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

从命令行:

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

3
我喜欢这个纯Windows脚本!我建议使用-match '[\?i]' -replace '^.{8}'代替方法,即使文件名以空格开头,该方法也能正常工作,并且还会删除忽略的文件。
gimpf

1
使用gimpf的建议调整效果很好,但是遇到了一个ItemNotFoundException的情况。事实证明,svn状态结果集中只有一个文件。此调整可解决以下问题:code@(svn status --no-ignore)-match'[\?i]'-replace'^。{8}'| rm`。在这个职位
dirtybird

1
并且因为这会提示您输入不在svn中的目录(因为未指定递归),所以在脚本中使用它没有好处。用:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

这个单行代码对我有用(基于理查德·汉森的答案,这令人惊讶地不适用于包含空格的文件):

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

2
也要删除未版本控制的文件夹,请添加-frrm命令:svn status --no-ignore | grep'^ [I?]'| 切-c 9- | xargs -d“ \ n” -I {} rm -fr {}
丹尼斯·戈洛马佐夫

5

使用TortoiseSVN:

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

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

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


我相信这只会删除非版本文件。被忽略的项目不会受到影响。
德克·沃尔玛

2
您无需使用提交对话框,就可以忽略文件:TortoiseSVN | 检查修改。然后,您可以单击“显示忽略的文件”并适当地排序/删除。
2010年

4

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

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

1
如果文件名包含空格,则此操作会中断
Richard Hansen 2012年

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工具。:)


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")
Darien Pardinas 2015年

@DarienPardinas,你的版本是特别有用的,如果插入到一个詹金斯“执行Windows批处理命令”,这是我刚学不及时而更像是一个批处理脚本,因此需要一个命令%%%
jxramos

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.