如果修改子模块,是否可以将提交推回到子模块的原点,还是需要克隆?如果是克隆,是否可以将克隆存储在另一个存储库中?
如果修改子模块,是否可以将提交推回到子模块的原点,还是需要克隆?如果是克隆,是否可以将克隆存储在另一个存储库中?
Answers:
子模块不过是另一个仓库中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"
gh-pages
分支合作以获取有关github回购文件的信息时:)
请注意,由于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 d34141c,commit 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-config
fetch
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
git config push.recurseSubmodules on-demand
。然后,简单的操作git push
就足以推送所有内容(主存储库和子模块)。请参阅下面我编辑的答案。