我有一组子模块和一个构建脚本,传递给我。
脚本想要从每个子模块中删除.git
子目录。我的子模块集包括两个子模块,这两个子模块应该在公共目录的子目录中创建:
一些细节被删除,这表示.gitmodules
中的内容(以及当前不在parent
下的五个附加模块:
[submodule "parent/expat"]
path = parent/expat
url = /path/to/expat.git
[submodule "parent/build"]
path = parent/build
url = /path/to/External.git
脚本当前包含此行以删除.git文件:
git submodule foreach --quiet --recursive rm -rf .git
这会出错:
error: pathspec 'parent/build/' did not match any file(s) known to git.
Did you forget to 'git add'?
此脚本已经可以与其他民间的子模块集合一起使用,因此我提交的任何修复都将得到密切关注。我提出的唯一修正案假设不包括当前命令所涵盖的案例。
如果我从--recursive
命令中删除foreach
选项,那么在我的情况下,所有不需要的.git
目录都将被删除。
其中任何一个都可以作为答案:
我可以保护自己的变化吗?当然,如果我的同事出乎意料地使用嵌套的子模块,我可能无法做到。
我可以做一些同等且简单的删除.git
目录的东西吗?据推测,过去的作者知道像find . -name .git -exec rm -rf {};
这样的事情,并决定故意使用submodule foreach --recursive
。
我也期待未来,当我将转换为git更复杂的项目时。它将共享相同的External.git子模块,expat模块和几个将成为expat模块兄弟的模块,当然还有更多不在parent
下的子模块。
答案 0 :(得分:1)
submodule foreach --recursive
可能首先执行命令(删除.git
),然后尝试查找子子模块...除了它不再在子模块git repo中运行(因为它的.git只是被删除了。)
find . -name .git -exec rm -rf {};
是更安全的方法
OP cardiff space man指出in the comments:
find . -name .git -exec rm -rf {};
也失败了,因为其中一个.git
是一个目录,它在find
通知它是一个目录和find
想要的时间之间消失了探访孩子们。
所以必须是find|xargs
管道。