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

时间:2010-05-10 15:18:57

标签: svn tortoisesvn ignore

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

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

12 个答案:

答案 0 :(得分:127)

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

答案 1 :(得分:96)

使用TortoiseSVN:

答案 2 :(得分:95)

我知道这是旧的,但万一其他人偶然发现它,svn支持Kierans-iMac:~ bla$ ./firstscript.command "/Users/bla/Desktop/untitled\ folder\ 2/v210.mov.mkv" ffmpeg version 2.7.2 Copyright (c) 2000-2015 the FFmpeg developers built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) configuration: --prefix=/usr/local/Cellar/ffmpeg/2.7.2_1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libfaac --enable-libass --enable-ffplay --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 ' --enable-nonfree --enable-vda libavutil 54. 27.100 / 54. 27.100 libavcodec 56. 41.100 / 56. 41.100 libavformat 56. 36.100 / 56. 36.100 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 16.101 / 5. 16.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.100 / 1. 2.100 libpostproc 53. 3.100 / 53. 3.100 “/Users/bla/Desktop/untitled\: No such file or directory 的较新版本(1.9或更高版本),例如--remove-unversioned

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

答案 3 :(得分:40)

这个oneliner可能会帮助你:

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

小心使用!

答案 4 :(得分:14)

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

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

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

答案 5 :(得分:7)

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

TortoiseSVN cleanup options

答案 6 :(得分:7)

使用powershell:

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

从命令行:

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

答案 7 :(得分:5)

使用TortoiseSVN:

  1. 右键单击工作副本的根目录,然后选择TortoiseSVN - > “检查修改”
  2. 选择“显示忽略的文件”
  3. 按“文字状态”列
  4. 排序
  5. 滚动到“非版本化”文件,现在全部组合在一起;选择它们全部并右键单击 - >删除
  6. 滚动到“已忽略”的文件,现在全部组合在一起;选择它们全部并右键单击 - >删除
  7. 这不是一个很好的干净解决方案,但是我知道的最快的方式(在Windows上)。

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

答案 8 :(得分:5)

这个oneliner对我有用(基于Richard Hansen的回答,对于包含空格的文件而言令人惊讶地不起作用):

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

答案 9 :(得分:4)

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

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

答案 10 :(得分: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工具。 :)

答案 11 :(得分:1)

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

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

另一个(野蛮)方法是提交更改,从文件夹中删除所有内容并再次结帐。