Git子模块推送

如果我修改一个子模块,我可以将提交推回到子模块的起源,还是需要一个克隆? 如果克隆,我可以在另一个存储库中存储一个克隆?

一个子模块只不过是在一个额外的元数据(gitlink树入口,.gitmodules文件)另一个回购的git回购的克隆,

 $ cd your_submodule $ git checkout master <hack,edit> $ git commit -a -m "commit in submodule" $ git push $ cd .. $ git add your_submodule $ git commit -m "Updated submodule" 

请注意,由于git1.7.11( [ANNOUNCE] Git 1.7.11.rc1和发行说明 ,2012年6月)提到:

学会了“ git push --recurse-submodules ”,以便有select地查看绑定到超级项目的子模块的历史logging并将其推出。

可能在这个补丁和--on-demand选项之后完成:

 recurse-submodules=<check|on-demand>:: 

确保所推送的版本使用的所有子模块提交在远程跟踪分支上可用。

  • 如果使用检查,将检查所有在要修订的版本中更改的子模块提交在远程可用。
    否则,推送将被中止并以非零状态退出。
  • 如果on-demand ,则会推送修订中要更改的所有子模块。
    如果按需不能推动所有必要的修改,它也将被中止并以非零状态退出。

所以你可以把所有东西都放在一起(从母公司回购)a:

 git push --recurse-submodules=on-demand 

该选项仅适用于一个嵌套级别。 其他子模块内子模块的更改将不会被推送。


使用git 2.7(2016年1月),一个简单的git push将足以推动父代回购…及其所有子模块。

请参阅提交d34141c , 提交f5c7cd9 (2015年12月3日), 提交f5c7cd9 (2015年12月3日),并提交b33a15b (2015年11月17日) Mike Crowe( mikecrowe ) 。
(由Junio C gitster合并- gitster -于2015年12月21日提交5d35d72 )

push :添加recurseSubmodulesconfiguration选项

--recurse-submodules命令行参数已经存在了一段时间,但是它没有等价的configuration文件。

按照git fetch的相应参数的样式,我们来创buildpush.recurseSubmodules来为这个参数提供默认值。
这也需要添加--recurse-submodules=no ,以便在需要时在命令行上覆盖configuration。

实现这个最直接的方法似乎是以类似的方式在submodule-configpush使用代码。

git config doc现在包括 :

push.recurseSubmodules

确保远程跟踪分支上提供了要推送的版本所使用的所有子模块提交。

  • 如果这个值是' check ',那么Git会validation所有在被修改版本中被改变的子模块提交在子模块的至less一个远端是可用的。 如果有任何提交丢失,推送将被中止并以非零状态退出。
  • 如果该值是“ on-demand ”,那么在推送中修改的所有子模块将被推送。 如果按需不能推动所有必要的修改,它也将被中止并以非零状态退出。 –
  • 如果该值为“ no ”,则在保持推送时忽略子模块的默认行为。

您可以在推送时通过指定' --recurse-submodules=check|on-demand|no '来覆盖此configuration。

所以:

 git config push.recurseSubmodules on-demand git push 

Git 2.12(2017年第1季度)

git push --dry-run --recurse-submodules=on-demand将会实际工作。

见布兰登·威廉姆斯(布兰登·威廉姆斯)( mbrandonw )的 提交0301c82 , 提交1aa7365 (2016年11月17日) 。
(由Junio C gitster合并- gitster -在12cf113 ,2016年12月16日提交 )

push run with --dry-run实际上并没有( push run with --dry-run 2016年12月11日和更低/之前)执行干运行时,configuration推推子模块按需。
相反,所有需要推送的子模块实际上被推送到他们的遥控器,而超级项目的任何更新都是以空运行的方式执行的。
这是一个错误,而不是干运行的预期行为。

当configuration为按需recursion--dry-run模块时,教导push尊重--dry-run选项。
这是通过将--dry-run标志传递给执行干运行的子模块的subprocess来完成的。


仍然在Git 2.12,你现在有一个“ --recurse-submodules=only ”选项来推子模块而不用推顶级超级项目

见布兰登·威廉姆斯(布兰登·威廉姆斯)( mbrandonw )的 提交225e8bf , 提交6c656c3 , 提交14c01bd (2016年12月19日) 。
(由Junio C gitster合并- gitster – 承诺 2017年1月31日第792e22e )