Git子模块推送


128

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


4
使用git 2.7(2016年1月),您只需设置一次git config push.recurseSubmodules on-demand。然后,简单的操作git push就足以推送所有内容(主存储库和子模块)。请参阅下面我编辑的答案
VonC

请提供您要执行的操作的示例代码。
西罗Santilli郝海东冠状病六四事件法轮功2016年

Answers:


138

子模块不过是另一个仓库中git仓库的克隆,其中包含一些额外的元数据(gitlink树条目,.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"

1
是的,不要忘记在推送之前从同步的本地分支(如果有)中提取更改。发生例如 当与gh-pages分支合作以获取有关github回购文件的信息时:)
NiKo 2012年

我不明白在添加your_submodule之前如何CD your_submodule?我认为添加子模块的最佳方法是使用“ add” git命令。那么还有另一种添加子模块的方法吗?
MrSo

1
@MrSo我认为子模块已经存在,他正在暗示要更改子模块中的某些内容。
HattrickNZ

108

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

git push --recurse-submodules”学会了选择性地研究绑定到超级项目的子模块的历史并将其推出。

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

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

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

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

因此,您可以(从父存储库中)通过以下方式一次性推送所有内容:

git push --recurse-submodules=on-demand

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


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

请参阅Mike Crowe()的commit d34141ccommit f5c7cd9(2015年12月3日),commit f5c7cd9(2015年12月3日)和commit b33a15b(2015年11月17日(由Junio C Hamano合并--commit 5d35d72中,2015年12月21日)mikecrowe
gitster

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

Git 2.12(2017年第一季度)

git push --dry-run --recurse-submodules=on-demand 会真正起作用。

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

push run with --dry-run在将push配置为按需推送子模块时,实际上(Git 2.11 Dec.2016和更低/之前)没有执行空运行。
实际上,所有需要推送的子模块实际上都推送到了它们的远程,而超级项目的任何更新都以空运行的方式执行。
这是一个错误,而不是空运行的预期行为。

push尊重--dry-run配置为“点播”递归推子模块时的选择。
这是通过将--dry-run标志传递给子进程来完成的,该子进程在执行空运行时对子模块执行推送。


仍然在Git 2.12中,您现在有了一个--recurse-submodules=only选项,可以将子模块推出,而无需推送顶级超级项目

请参阅Brandon Williams(提交225e8bf提交6c656c3提交14c01bd(2016年12月19日(通过合并JUNIOÇ滨野- -提交792e22e,2017年1月31日)mbrandonw
gitster


现在可用了吗?
CMCDragonkai 2013年

@CMCDragonkai是的,您可以在git-scm.com/docs/git-push中看到它。我已经编辑了答案。
VonC

是否有递归提交?
CMCDragonkai 2014年

1
你总是可以做“git的子模块的foreach犯”
reflog了

我必须使用bitbucket网址更新.gitmodules文件。
wclark '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.