Git子模块执行update --init时未拉取对应分支最新版本问题咨询
Git子模块版本拉取问题解答
问题1:为什么仅执行git submodule update --init --recursive无法拉取other分支的最新版本?
git submodule update命令默认行为是检出主仓库当前提交中绑定的子模块固定提交哈希,不会主动同步子模块远程跟踪分支的最新提交,你用到的几个参数作用完全不涉及拉取远程分支最新:
--init:仅完成子模块的配置注册、本地仓库克隆,没有拉取远程分支最新提交的逻辑--recursive:仅递归处理嵌套的子模块,不影响子模块版本的选择逻辑- 只有添加
--remote参数时,Git才会读取.gitmodules中配置的branch字段,去拉取对应分支的最新HEAD提交。
你只是修改了本地.gitmodules的分支配置,既没有更新主仓库绑定的子模块提交哈希,也没有在update命令中指定拉取远程最新,自然拿不到other分支的最新提交。
问题2:Git选择使用499ae4ccb7bf59c2c3acab5b63e1e6ff58b49ca4这个修订版本的逻辑是什么?
Git的子模块版本绑定逻辑是:主仓库会将每个子模块的当前提交哈希作为一个特殊的「gitlink」条目,存放在主仓库的提交树中,这个哈希和.gitmodules配置完全独立,优先级更高。
你看到的这个哈希,就是你修改.gitmodules之前,主仓库最后一次提交子模块相关变更时,记录的当时子模块master分支的HEAD提交值。只要你没有在主仓库中更新这个gitlink条目,也没有用--remote参数强制拉取远程分支最新,Git永远会优先检出这个绑定的固定哈希。
可选优化方案
如果希望后续团队成员执行初始化命令就能直接拿到对应分支的目标版本,可以在修改完.gitmodules并执行git submodule update --remote拿到最新提交后,将.gitmodules的变更 + 子模块新的提交哈希(gitlink变更)一起提交到主仓库,后续其他成员拉取主仓库最新代码后再执行git submodule update --init --recursive就会直接检出新的绑定版本。
内容的提问来源于stack exchange,提问作者Philippe MESMEUR
相关产品推荐
相关产品推荐

