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

Posted

技术标签:

【中文标题】如何删除工作副本中所有未版本化/忽略的文件/文件夹?【英文标题】:How can I delete all unversioned/ignored files/folders in my working copy? 【发布时间】:2011-02-17 17:31:45 【问题描述】:

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

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

【问题讨论】:

Automatically remove Subversion unversioned files的可能重复 【参考方案1】:

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

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

【讨论】:

对我来说,这是正确的答案。这是一个跨平台的命令行答案。此外,您可以使用 svn cleanup . --remove-ignored 删除被忽略的文件 适用于 svn 1.6 及更高版本。 请将其更改为 1.9,另请参阅 subversion.apache.org/docs/release-notes/1.9.html(我在本地尝试过,但它不起作用,我在 1.8.8 上) 似乎问题在于它没有删除未版本化的文件夹 @Nyerguds:没错,这不会删除未受版本控制的文件夹,而只会删除未受版本控制的文件。有人找到解决方案了吗?【参考方案2】:
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

【讨论】:

正是我想要的,在 linux 和 MacOS 上也能像魅力一样工作! 您需要重置 IFS 吗?我选择不制作“svnclean”脚本。所以我想知道这是否会在脚本的其余部分搞砸 IFS... @matrixugly:不,您不需要将IFS 改回原来的样子。当您执行VARNAME=value command 时,将value 分配给VARNAME 仅适用于command 的执行期间(有一些例外情况不适用于read)。请参阅the POSIX specification 和this POSIX bug report 了解更多详情。 @rich,感谢分享。几年前来寻找 svn cleanup 解决方案,还带着一些 shell 脚本知识离开了!显然我已经回到这个答案了。 小心,这也将删除隐藏目录,如 .idea,这将刷新您的 IntelliJ Idea 配置(包括例如搁置的更改......)【参考方案3】:

使用 TortoiseSVN:

右键单击工作副本文件夹,while holding the shift-key down 选择“删除未受版本控制的项目”

【讨论】:

不错的功能!不过,我必须阅读该链接才能发现它仅适用于 XP 上的列表视图(而不是树视图)——也许您应该在答案中包含它。 命令行版本的svn(特别是windows)不提供同样的功能吗? 正如下面有人指出的那样:svn cleanup --remove-unversioned --remove-ignored .【参考方案4】:

这个oneliner可能会帮助你:

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

小心使用!

【讨论】:

这不会删除被忽略的文件,如果文件名包含空格会中断 它也不会删除被忽略的文件 您可以使用svn status --no-ignore很好地捕获被忽略的文件。 事实上,我认为将被忽略的文件保留在原地是一个可选功能。【参考方案5】:

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

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

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

【讨论】:

命令末尾需要一个额外的双引号。我只是添加它,但显然编辑必须至少有六个字符。【参考方案6】:

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

【讨论】:

【参考方案7】:

使用 powershell:

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

从命令行:

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

【讨论】:

我喜欢这个纯 Windows 脚本!我建议改用 -match '[\?i]' -replace '^.8',即使文件名 以空格开头 也可以正常工作,并且还会删除被忽略的文件。 使用 gimpf 建议的调整效果很好,但我遇到了一个遇到 ItemNotFoundException 的情况。事实证明,svn status 结果集中只有一个文件。这个调整修复了这个问题:code@(svn status --no-ignore) -match '[\?i]' -replace '^.8' | rm`。在this post 的帮助下解决了这个问题 因为这会提示您输入不在 svn 中的目录(因为没有指定递归),所以它不适合在脚本中使用。使用:powershell -Command "&(svn status --no-ignore) -match '[\?i]' -replace '^.8' | remove-item -force -recurse"【参考方案8】:

这个 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 【参考方案9】:

使用 TortoiseSVN:

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

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

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

【讨论】:

我相信这只会删除非版本控制的文件。被忽略的项目不会受到影响。 你不需要使用提交对话框,你可以得到被忽略的文件:右键| TortoiseSVN |检查修改。然后您可以单击“显示忽略的文件”并适当地排序/删除。【参考方案10】:

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

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

【讨论】:

如果文件名包含空格,则会中断【参考方案11】:

有人说您不能从 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") @DarienPardinas,如果插入 Jenkins“执行 Windows 批处理命令”,您的版本特别有用,我刚刚了解到这不是命令提示符,而是更像一个批处理脚本,因此需要 @987654323 @以上%【参考方案12】:

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

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

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

【讨论】:

以上是关于如何删除工作副本中所有未版本化/忽略的文件/文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

SVN 错误 - 不是工作副本

如何从当前 Git 工作树中删除本地(未跟踪)文件

从 SVN 存储库中删除文件而不删除本地副本

svn,导入数据到版本库及使用工作副本

Subclipse svn:忽略

从SVN工作副本中删除所有“丢失”文件