如果我有一个 Subversion 存储库的工作副本,是否可以使用单个命令或工具删除该工作副本中的所有未版本控制或忽略的文件?本质上,我正在寻找与 git clean
类似的 SVN。
命令行或 GUI 解决方案(对于 TortoiseSVN)都是可以接受的。
我知道这是旧的,但如果其他人偶然发现它,svn 的新版本(1.9 或更高版本)支持 --remove-unversioned
,例如 svn cleanup . --remove-unversioned
。
https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
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
IFS
改回原来的样子。当您执行 VARNAME=value command
时,将 value
分配给 VARNAME
仅适用于 command
的执行期间(有一些例外情况不适用于 read
)。有关详细信息,请参阅 the POSIX specification 和 this POSIX bug report。
使用 TortoiseSVN:
右键单击工作副本文件夹,同时按住 shift 键
选择“删除未版本控制的项目”
svn cleanup --remove-unversioned --remove-ignored .
这个 oneliner 可能会帮助您:
$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
小心使用!
svn status --no-ignore
捕获被忽略的文件。
使用 Powershell 修改 Yanal-Yves Fargialla 和 gimpf 的答案(但不允许对 Stackoverflow 的原始帖子发表评论):
powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}
这会添加克拉 ("^") 以指定行首,避免匹配包含字母 "i" 的所有文件。还要将 -recurse 和 -force 的标志添加到 rm 以使此命令非交互式,因此可在脚本中使用。
SVN 中的许多事情可以用不同的方式完成,这里给出的各种命令行答案就是明证。随着版本 1.7 的出现,TortoiseSVN 还有另一种技术,事实上,它提供了比 Stefan 提供的答案更精细的分辨率,让您可以从忽略的文件中分别选择非版本化文件。只需选择 TortoiseSvn >> Clean up...
即可打开此对话框。
https://i.stack.imgur.com/l7Kjt.png
使用 powershell:
(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm
从命令行:
powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
-match '[\?i]' -replace '^.{8}'
,即使文件名 以空格开头 也能正常工作,并且还会删除被忽略的文件。
code
@(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | rm`。在 this post 的帮助下想通了
powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
这个 oneliner 对我有用(基于 Richard Hansen 的回答,令人惊讶的是它不适用于包含空格的文件):
svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
-fr
添加到 rm
命令:svn status --no-ignore | grep '^[我?]' |切-c 9- | xargs -d"\n" -I{} rm -fr {}
使用 TortoiseSVN:
右键单击工作副本的根目录并选择 TortoiseSVN ->“检查修改” 选择“显示忽略的文件” 按“文本状态”列排序滚动到“非版本化”文件,现在全部组合在一起;全部选择它们并右键单击-> 删除滚动到“忽略”文件,现在全部组合在一起;全部选中并右键单击->删除
不是一个很好和干净的解决方案,而是我所知道的最快的方法(在 Windows 上)。
感谢 pkh 提供忽略文件的提示。
这与其他答案类似,但实际上会被忽略文件(请注意 RE 中的“I”):
rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
有人说您不能从 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")
%%
而不是 %
如果您在 linux 系统下,您不能仅使用 SVN 命令行(但不确定 GUI 工具)来删除它们,这可能会有所帮助:
http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/
另一种(残酷的)方法是提交更改,从文件夹中删除所有内容并再次签出。
svn cleanup . --remove-ignored
删除被忽略的文件