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

如果子模块可能有公共父目录,如何从子模块中剥离.git文件?,git,Git,我有一系列子模块和一个传给我的构建脚本 脚本希望从每个子模块中删除.git子目录。我的子模块集合包括两个子模块,它们应该在公共目录的子目录中创建: 某些详细信息已删除,这表示.gitmodules中的内容(以及当前不在父项下的大约五个附加模块): [submodule "parent/expat"] path = parent/expat url = /path/to/expat.git [submodule "parent/build"] pat

我有一系列子模块和一个传给我的构建脚本

脚本希望从每个子模块中删除
.git
子目录。我的子模块集合包括两个子模块,它们应该在公共目录的子目录中创建:

某些详细信息已删除,这表示
.gitmodules
中的内容(以及当前不在
父项下的大约五个附加模块):

[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'?
这个脚本已经可以很好地处理其他人的子模块集合,所以我提交的任何修复都将被仔细研究。我提出的唯一修复假设不会涵盖当前命令所涵盖的情况

如果我从
foreach
命令中删除
--recursive
选项,那么在我的情况下,所有不需要的
.git
目录都将被删除

以下任何一项都可能是答案:

  • 我可以为我的更改辩护吗?当然,如果我的同事意外地使用嵌套子模块,我可能无法这样做


  • 我能做一些等效且同样简单的事情来删除
    .git
    目录吗?大概过去的作者知道类似
    find.-name.git-exec rm-rf{};
    的事情,并决定在知情的情况下使用
    子模块foreach--recursive

我也在展望未来,届时我将把一个更复杂的项目转换为git。它将共享相同的External.git子模块、expat模块和其他几个模块,这些模块将是expat模块的兄弟模块,当然还有更多的子模块,这些子模块不属于
parent

子模块foreach--recursive
可能首先执行命令(删除
.git
),然后尝试查找子模块……但它不再在子模块git repo中运行(因为它的.git刚刚被擦除)


find.-name.git-exec rm-rf{};
是一种更安全的方法。
报告指出:


find.-name.git-exec rm-rf{};
也会失败,因为
.git
中的一个目录在
find
注意到它是一个目录和
find
想要访问它的子目录之间消失了。
因此它必须是一个
find | xargs
管道


你的评论是如此合理的解释,以至于我只是做了一个实验来仔细检查我的假设。我的假设是我的前任在脚本中成功地使用了这条路径(它还有一个更常用的subversion选项).我的假设是错误的。
git子模块foreach--recursive rm-rf.git
命令在任何情况下看起来都不可行。这意味着我的问题的前提是无效的。我将在一个小时左右删除它。在立即删除它和给你和投票人一个看到此评论的机会之间达成妥协@cardiffspaceman无需删除:您可以选择upvote并接受。这将帮助其他人。我遵从您的判断
find.-name.git-exec rm-rf{}
也会失败,因为其中一个.git的目录在
find
注意到它是一个目录和
find
想要访问它的子目录之间消失了。所以它必须是
find | xargs
pipeline@cardiffspaceman好的,我已经把你的评论包括在答案中了,以便更直观。