Git子模块推

web*_*jay 115 git git-submodules

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

man*_*lds 121

子模块只不过是另一个repo中的git repo的克隆,带有一些额外的元数据(gitlink tree entry,.gitmodules文件)

$ 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"
Run Code Online (Sandbox Code Playgroud)

  • 是的,并且不要忘记在推送之前从同步的本地分支(如果有)中提取更改。发生例如。使用 `gh-pages` 分支获取 github 存储库上的文档时:) (2认同)
  • @MrSo 我认为子模块已经存在,他正在进入它以更改子模块中的某些内容。 (2认同)
  • @MrSo `git add your_submodule` 不会将子模块添加到项目中,子模块已经在这里了。将子模块添加到项目的命令是:`git submodule add [url]`。他在这里所做的只是将子模块上所做的更改从工作目录移动到暂存区域。就像他对任何其他更改所做的那样(即“git add [filename/-A/.]”)。然后他可以提交更改。 (2认同)

Von*_*onC 103

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

" git push --recurse-submodules"学会了选择性地查看与超级项目绑定的子模块的历史并推出它们.

可能在此补丁--on-demand选项之后完成:

recurse-submodules=<check|on-demand>::
Run Code Online (Sandbox Code Playgroud)

确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用.

  • 如果check使用,将检查在推送的修订中更改的所有子模块提交在远程上是否可用.
    否则推送将被中止并以非零状态退出.
  • 如果on-demand使用,则将推送要推送的修订中更改的所有子模块.
    如果按需无法推送所有必要的修订,它也将被中止并退出非零状态.

因此,您可以一次性推送所有内容(来自父代仓库)a:

git push --recurse-submodules=on-demand
Run Code Online (Sandbox Code Playgroud)

此选项仅适用于一个嵌套级别.不会推送对另一个子模块内部子模块的更改.


使用git 2.7(2016年1月),一个简单的git push就足以推送父repo ...及其所有子模块.

请参阅提交d34141c,提交f5c7cd9(2015年12月3日),提交f5c7cd9(2015年12月3日),并提交b33a15b(2015年11月17日)作者:Mike Crowe(mikecrowe).
(由Junio C gitsterHamano合并- -在2015年12月21日的提交5d35d72中)

push:添加recurseSubmodules配置选项

--recurse-submodules命令行参数已存在一段时间,但它没有配置文件等同.

按照相应参数的样式git fetch,让我们发明push.recurseSubmodules为这个参数提供一个默认值.
这还需要添加--recurse-submodules=no以允许在需要时在命令行上覆盖配置.

实现这一点最直接的方法似乎 是以类似的方式push使用代码.submodule-configfetch

git config文件现在包括:

push.recurseSubmodules:

确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用.

  • 如果值为' check',则Git将验证在子模块的至少一个远程处可用的所有要推送的修订中更改的子模块提交.如果缺少任何提交,则推送将中止并以非零状态退出.
  • 如果值为' on-demand',那么将推送在要推送的修订版中更改的所有子模块.如果按需无法推送所有必要的修订,它也将被中止并退出非零状态.-
  • 如果值为' no',则保留推送时忽略子模块的默认行为.

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

所以:

git config push.recurseSubmodules on-demand
git push
Run Code Online (Sandbox Code Playgroud)

Git 2.12(2017年第1季度)

git push --dry-run --recurse-submodules=on-demand 实际上会有效.

请参阅Brandon Williams()提交0301c82,提交1aa7365(2016年11月17日).(由Junio C Hamano合并- -提交12cf113,2016年12月16日)mbrandonw
gitster

push run with --dry-run当push配置为按需推送子模块时,实际上并没有(Git 2.11 Dec. 2016和lower/before)执行干运行.
相反,所有需要推送的子模块实际上都被推送到他们的遥控器,而超级项目的任何更新都是作为干运行执行的.
这是一个错误,而不是干跑的预期行为.

在配置为递归推送子模块"按需"时教导push尊重该--dry-run选项.
这是通过将--dry-run标志传递给子进程来完成的,子进程在执行干运行时执行子模块的推送.


仍然在Git 2.12中,你现在有了一个" --recurse-submodules=only"选项来推送子模块而不需要推送顶级超级项目.

请参阅Brandon Williams()提交225e8bf,提交6c656c3,提交14c01bd(2016年12月19日).(由Junio C Hamano合并- -提交792e22e,2017年1月31日)mbrandonw
gitster

  • 你总是可以做“git submodule foreach commit” (2认同)