如果子模块可能有公共父目录,如何从子模块中删除.git文件?

时间:2015-11-23 02:17:01

标签: git

我有一组子模块和一个构建脚本,传递给我。

脚本想要从每个子模块中删除.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下的子模块。

1 个答案:

答案 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管道