Git通配符 - 删除所有子目录的实例

7

我正在尝试执行git rm --cached -r <folder>命令以递归地删除名为.svn的文件夹的所有实例。我尝试过以下方法:

.svn
/.svn
/*/.svn
/*/*/.svn

etc 

它可以工作,但我相信有一种更加动态的方式。

谢谢


请注意:Git 能够很好地导入 SVN 存储库并保留历史记录。 - Alexander Gladysh
5个回答

16
正确的解决方案应该是:
find . -type d -name '.svn' -print0 | xargs -0 git rm --cached -r --

@gregor的代码在带有空格的目录上会失败。


3
如果git命令出现“did not match..”错误,可以使用--ignore-unmatch参数。这是在Google搜索中排名第一的结果,已经存在4年了。 - stampede76
对于不熟悉 find 命令的人,你可以在 -name 参数中使用通配符 (*),并将 type 更改为 -f(而不是 -d)以搜索文件。别忘了像 @steve76 上面说的那样使用 --ignore-unmatch - rgoliveira

3

find、管道和xargs是你的好伙伴:

find . -name .svn | xargs git rm -r 

1

如果您的工作树中没有其他更改(您可以先将它们存储),那么可能有一种更简单的方法:

find -type d -name .svn -delete
git add -u
git commit -m 'remove svn folders -- no idea which maniac would stage them'

如果你只想取消暂存,但不想物理删除它们,请选择安东的答案

find -type d -name .svn -print0 | xargs -0 git rm -r --cached

1
find . -name .svn -exec git rm -r --cached {} \;

如果没有必要,就没有必要调用xargs。


1
这对我有用:

这对我有用:

find . -name '.svn' -print0 | xargs -0 git rm --cached --ignore-unmatch -r --

感谢 @steve76 提供的 --ignore-unmatch 选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接