Svn 如何删除工作副本中所有未设置版本/被忽略的文件/文件夹?
如果我有Subversion存储库的工作副本,是否有一种方法可以使用单个命令或工具删除该工作副本中所有未版本或被忽略的文件?基本上,我在寻找SVN的类似物Svn 如何删除工作副本中所有未设置版本/被忽略的文件/文件夹?,svn,tortoisesvn,ignore,Svn,Tortoisesvn,Ignore,如果我有Subversion存储库的工作副本,是否有一种方法可以使用单个命令或工具删除该工作副本中所有未版本或被忽略的文件?基本上,我在寻找SVN的类似物 可以接受命令行或GUI解决方案(用于TortoiseSVN)。这一行可能会帮助您: $ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf 小心使用 如果您在linux系统下,则不能仅使用SVN命令行删除它们(但不确定GUI工具),这可能会有所帮助: 另一种(残酷的)方法是提交
可以接受命令行或GUI解决方案(用于TortoiseSVN)。这一行可能会帮助您:
$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
小心使用 如果您在linux系统下,则不能仅使用SVN命令行删除它们(但不确定GUI工具),这可能会有所帮助:
另一种(残酷的)方法是提交更改,从文件夹中删除所有内容,然后再次签出。这与其他答案类似,但实际上会得到忽略的文件(注意REs中的“I”): 使用乌龟vn:
- 右键单击工作副本文件夹
- 选择“删除未设置版本的项目”
- 被忽略和未跟踪的文件都将被删除
- 即使文件名包含空格(换行符除外,但除了使用
选项并解析生成的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的出现,还有另一种用于OrtoiseSVN的技术,事实上,它提供了比Stefan提供的答案更精细的分辨率,允许您分别选择未版本化的文件和被忽略的文件。只需选择
TortoiseSvn>>清理…
即可打开此对话框
使用powershell:
(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm
从命令行:
powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
此oneliner适用于我(基于Richard Hansen的答案,该答案令人惊讶地不适用于包含空格的文件):
使用Powershell修改Yanal Yves Fargialla和gimpf的答案(但Stackoverflow不允许对原始帖子发表评论):
这将添加克拉(“^”)以指定行的开头,避免匹配包含字母“i”的所有文件。还将-recurse和-force的标志添加到rm中,以使此命令非交互式,因此在脚本中可用。有人说您不能从Windows命令行执行此操作 公牛
在一行中完成,不需要单个GNU工具。:) 我知道这很旧,但如果其他人偶然发现,svn的较新版本(1.9或更高版本)支持
——删除未版本的,例如svn清理--删除未版本的
我相信这只会删除未版本控制的文件。被忽略的项目不会受到影响。您不需要使用“提交”对话框,并且您可以获得被忽略的文件:右键单击| TortoiseSVN |检查修改。然后你可以点击“显示被忽略的文件”并进行适当的排序/删除。很好的功能!不过,我必须阅读链接,才能发现它只适用于XP上的列表视图(而不是树视图)——也许你应该在回答中包含它不提供相同的功能?正如sombody在下面指出的:svn cleanup--remove unversioned--remove ignored.
这不会删除被忽略的文件,如果文件名包含空格,它也不会删除被忽略的文件。您可以使用svn status--no ignore
捕获被忽略的文件。事实上,我认为它是一个特性,将文件忽略,如果文件名包含WeleSePeCo也删除未版本的文件夹,添加<代码> -FR 到<代码> RM命令:SvN状态——不忽略GRP'^(i?)]剪切-C 9 - xxARGS -D“\n”- i {} RM- FR{}我喜欢这个纯Windows脚本!我建议改为使用-match'[\?I]'-replace'^.{8}'
,即使文件名以空格开头,它也能正常工作,并删除被忽略的文件。使用gimpf建议的调整效果很好,但我遇到了ItemNotFoundException。事实证明,svn状态结果集中只有一个文件。此调整修复了该问题:code
@(svn状态--无忽略)-匹配“[\?i]”-替换“^.{8}”rm`。在和的帮助下解决了这个问题,因为这将提示您输入不在svn中的目录(因为没有指定recurse),所以它不适合在脚本中使用。用法:powershell-Command“&{(svn状态——不忽略)-match'[\?i]'-replace'^.{8}';remove item-force-recurse}”
正是我想要的,在linux和MacOS上也像一个符咒一样工作!您需要重置IFS吗?我选择不制作“svnclean”脚本。所以我想知道这是否会把脚本的其余部分的IFS搞砸…@Matrixuly:不,你不需要将IFS
更改回以前的状态。执行VARNAME=value命令时,将value
赋值给VARNAME
仅适用于执行命令的过程中(有些例外情况不适用于读取
)。有关详细信息,请参阅和。@rich,感谢您分享此信息。来找
(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm
powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}
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")