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

时间:2015-04-10 14:40:12

标签: git git-submodules

我有以下项目结构:

root-project
      |
      |-- A
      |   |
      |   |-- C
      |
      |-- B

A和B是根项目的子模块。 C又是一个子模块 项目A.假设我对项目A,B和C进行了更改 将这些变化归于各自的指数。之后我更新了 根项目中对A和B的引用并提交更改 同样。当我使用选项推送根项目的更改时 --recurse-submodules = on-demand,git推送项目A的所有提交, B和root项目,但默默地忽略了提交 项目C.我希望它也能推动项目C的变化。

我知道我可以通过在root-project文件夹中使用以下两个命令解决此问题。

git submodule foreach --recursive 'git push origin master'
git push

有人可以澄清我是否做错了或者这是git-push中的错误。我已经在git邮件列表上提出了这个问题,但没有收到任何回复:{{3 }}

我还编写了一个小shell脚本,用于设置描述的项目结构并执行递归推送操作: http://thread.gmane.org/gmane.comp.version-control.git/266184

git version 2.3.3

2 个答案:

答案 0 :(得分:1)

使用git 2.14.x / 2。5(2017年第3季度),

git push --recurse-submodules=on-demand将真正递归,但有一定条件。

commit c7be720Brandon Williams (mbrandonw)(2017年7月20日) (由Junio C Hamano -- gitster --合并于commit a49794d,2017年8月22日)

submodule - helper:教push-check来处理HEAD

  

06bf4adpush:传播远程和refspec   --recurse-submodules,git 2.13.0)推荐了如何将&ref; --recurse-submodules'国旗给出了。

     

唯一允许传播的refspec是指在超级项目和子模块中存在的ref的名称,但需要注意的是' HEAD'被禁止了。

     

这个补丁教授推送检查(子模块助手确定是否   refspec可以传播到子模块)以允许传播' HEAD'   当且仅当

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

答案 1 :(得分:0)

<块引用>

我的own answer的副本

如果您的子模块包含子模块,则命令 git push --recurse-submodules=on-demand 不起作用。 (git 版本:2.20.1)

在您的 ~/.gitconfig 文件中添加以下别名:

[alias]
    push-all = "! find . -depth -name .git -exec dirname {} \\; 2> /dev/null | sort -n -r | xargs -I{} bash -c \"cd {}; git status | grep ahead > /dev/null && { echo '* Pushing: {}'; git push; }\""

然后在您的父 git 文件夹中发出 git push-all

说明

  • !:我们正在发出一个非 git 命令。
  • find . -depth -name .git -exec dirname {} \\; 2> /dev/null :查找所有子模块(和 git 存储库,不会造成危害)
  • | sort -n -r:按路径深度排序,最深的在前。
  • | xargs -I{} bash -c \":将目录传递给以下命令:
    • cd {};cd 到目标目录。
    • git status | grep ahead > /dev/null:测试是否有必要推送此存储库。
    • && { echo '* Pushing: {}'; git push; }\"":通知和推送。