ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


g
gregpaton08

我知道这是旧的,但如果其他人偶然发现它,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:没错,这不会删除未受版本控制的文件夹,而只会删除未受版本控制的文件。有没有人找到解决方案?
R
Richard Hansen
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 specificationthis POSIX bug report
@rich,感谢分享。几年前来寻找 svn cleanup 解决方案,还带着一些 shell 脚本知识离开了!显然,我已经多次回到这个答案。
当心,这也将删除隐藏目录,如 .idea 这将刷新您的 IntelliJ Idea 配置(包括例如搁置的更改..)
o
oddRaven

使用 TortoiseSVN:

右键单击工作副本文件夹,同时按住 shift 键

选择“删除未版本控制的项目”


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

这个 oneliner 可能会帮助您:

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

小心使用!


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

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

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

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


该命令最后需要一个额外的双引号。我只是添加它,但编辑显然必须至少有六个字符。
M
Michael Sorens

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

https://i.stack.imgur.com/l7Kjt.png


Y
Yanal-Yves Fargialla

使用 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}"
D
Dennis Golomazov

这个 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 {}
T
Thomas Lötzer

使用 TortoiseSVN:

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

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

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


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

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

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

如果文件名包含空格,则会中断
C
ChokesMcGee

有人说您不能从 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 批处理命令”,您的版本特别有用,我刚刚了解到它不是命令提示符,而是更像一个批处理脚本,因此需要 %% 而不是 %
J
Juriy

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

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

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