git push --recurse-submodules=on-demand 具体会将提交推送至何处?
Git子模块推送问题解答
问题场景
父仓库包含一个子模块,该子模块有两个分支:Br1(当前检出分支)和Br2,各分支提交情况如下:
- 本地Br1分支提交链:A -> B
- 远程Br1分支提交链:A
- 本地Br2分支提交链:A -> B
- 远程Br2分支提交链:A -> B
本地Br1分支状态显示领先远程1个提交:
git status On branch v1.1.0_with_fixes Your branch is ahead of 'origin/v1.1.0_with_fixes' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean
但本地Br1的提交B的SHA已存在于远程仓库的Br2分支中。现在从父仓库执行git push --recurse-submodules=on-demand,会推送哪些内容?实验显示无任何内容被推送,求解释。
解答
git push --recurse-submodules=on-demand的核心逻辑是:
推送父仓库时,Git会先检查父仓库当前关联的子模块提交是否在远程子模块仓库中存在可被访问的引用(比如分支、标签)。只有当该提交在远程完全没有任何引用时,Git才会自动推送子模块的当前分支到远程对应分支;如果提交已经在远程有引用(不管是哪个分支),就会跳过子模块的推送操作。
回到你的场景:
- 子模块当前检出的是Br1,本地提交B虽然没在远程Br1分支上,但已经存在于远程Br2分支——Git检测到这个提交在远程有合法引用,因此不会触发Br1分支的推送。
- 如果父仓库本身没有未推送的提交(你没提到父仓库有需要推送的内容),那整个命令自然不会推送任何内容,这就和你的实验结果一致了。
如果想要把本地Br1的提交B推送到远程Br1分支,需要直接进入子模块目录执行git push origin Br1,或者在父仓库使用git push --recurse-submodules=check(这个参数会检查子模块提交是否在远程有引用,若没有则报错,不会自动推送),再手动处理子模块的推送。
内容的提问来源于stack exchange,提问作者DimanNe
相关产品推荐
相关产品推荐

