如果我修改子模块,我可以将提交推回到子模块源,还是需要克隆? 如果克隆,我可以将克隆存储在另一个存储库中吗?
答案 0 :(得分:111)
子模块只不过是另一个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"
答案 1 :(得分:94)
请注意,由于git1.7.11([ANNOUNCE] Git 1.7.11.rc1和release note,2012年6月)提及:
“
git push --recurse-submodules
”学会了选择性地查看绑定到超级项目的子模块的历史并推出它们。
可能在this patch和 --on-demand
选项后完成:
recurse-submodules=<check|on-demand>::
确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用。
- 如果使用
check
,将检查所有要推送的修订中更改的子模块提交是否可用于遥控器。
否则推送将被中止并以非零状态退出。- 如果使用
on-demand
,则将推送要推送的修订中更改的所有子模块。
如果按需无法推送所有必要的修订,它也将被中止并以非零状态退出。
因此,您可以一次性推送所有内容(来自父级回购)a:
git push --recurse-submodules=on-demand
此选项仅适用于一个嵌套级别。不会推送对另一个子模块内部子模块的更改。
使用git 2.7(2016年1月),一个简单的git push就足以推送父repo ...并所有其子模块。
请commit d34141c查看commit f5c7cd9,commit f5c7cd9(2015年12月3日),commit b33a15b(2015年12月3日)和Mike Crowe (mikecrowe
)(2015年11月17日)。
(Junio C Hamano -- gitster
--在commit 5d35d72中合并,2015年12月21日)
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年第1季度)
git push --dry-run --recurse-submodules=on-demand
实际上会有效。
commit 0301c82见commit 1aa7365,Brandon Williams (mbrandonw
)(2016年11月17日)
(Junio C Hamano -- gitster
--在2016年12月16日commit 12cf113合并)
当push配置为推送子模块时,
push run with --dry-run
实际上并不是(Git 2.11 Dec. 2016和lower / before)执行干运行 点播。
相反,所有需要推送的子模块实际上都被推送到他们的遥控器,而超级项目的任何更新都是以干运行的方式执行的。
这是一个错误,而不是干跑的预期行为。在配置为按需递归推送子模块时,教
push
尊重--dry-run
选项。
这是通过将--dry-run
标志传递给子进程来完成的,该进程在执行干运行时执行子模块的推送。
现在仍然在Git 2.12中,你现在有一个“--recurse-submodules=only
”选项来推送子模块,而无需推送顶级超级项目。
commit 225e8bf点击commit 6c656c3,commit 14c01bd,Brandon Williams (mbrandonw
)(2016年12月19日)。{
(Junio C Hamano -- gitster
--于2017年1月31日commit 792e22e合并)