git push --recurse-submodules=on-demand 并不是真正的递归

Uwe*_*att 6 git git-submodules

我有以下项目结构:

root-project
      |
      |-- A
      |   |
      |   |-- C
      |
      |-- B
Run Code Online (Sandbox Code Playgroud)

A 和 B 是根项目的子模块。C 又是项目 A 的子模块。假设我对项目 A、B 和 C 进行了更改,并将这些更改提交给相应的索引。之后,我更新根项目中对 A 和 B 的引用并提交该更改。当我使用选项 --recurse-submodules=on-demand 推送根项目的更改时,git 推送项目 A、B 和根项目的所有提交,但默默地忽略项目 C 的提交。我期望它也推动了项目 C 的变化。

我知道我可以通过在根项目文件夹中使用以下两个命令来解决这个问题。

git submodule foreach --recursive 'git push origin master'
git push
Run Code Online (Sandbox Code Playgroud)

有人可以澄清我是否做错了什么,或者这是否是 git-push 中的错误。我已经在 git 邮件列表上问过这个问题,但没有收到任何回复:http : //thread.gmane.org/ gmane.comp.version-control.git/266184

我还编写了一个小的 shell 脚本来设置所描述的项目结构并执行递归推送操作:https : //gist.github.com/usommerl/6e8defcba94bd4ba1438

版本 2.3.3

Von*_*onC 3

git push --recurse-submodules=on-demand将与 git 2.14.x/2.15(2017 年第 3 季度)真正递归,但有一些条件。

请参阅布兰登·威廉姆斯 (Brandon Williams )提交的 c7be720(2017 年 7 月 20 日(由Junio C Hamano 合并 -- --提交 a49794d中,2017 年 8 月 22 日)mbrandonw
gitster

子模块--helper:教push-check处理HEAD

06bf4adpush:使用 --recurse-submodules 传播远程和 refspec,git 2.13.0)中,教导了如何在--recurse-submodules给出 ' ' 标志时将 refspec 向下传播到子模块。

唯一允许传播的引用规范是命名超级项目和子模块中都存在的引用的引用规范,但需要注意的是不允许使用“HEAD”。

此补丁教导推送检查(确定 refspec 是否可以传播到子模块的子模块助手)当且仅当满足以下条件时才HEAD允许传播“ ” :

  • 超级项目和子模块都有相同的命名分支签出并且
  • 子模块不处于分离头状态。