子模块提交新Commit后,父仓库中的子模块Commit ID是否会自动更新?
Git子模块提交新Commit后,父仓库的子模块Commit ID是否自动更新?
结论
父仓库中不会自动更新其记录的子模块Commit ID。你看到git submodule status输出的Commit ID变化,只是子模块本地工作区的HEAD指向了新提交,而非父仓库的版本控制记录被修改。
详细解释
父仓库如何记录子模块
父仓库通过一个名为gitlink的特殊文件(对应子模块目录)存储子模块的特定Commit ID,这个ID会被纳入父仓库的版本控制。只有当你在父仓库中显式执行git add sub-repo并提交,才会更新父仓库记录的子模块Commit ID。状态变化的含义
从你的命令输出可以看到:
$ git submodule status +8bfc4220fbd6c941e493bfa790d049c7169514f9 sub-repo (heads/main-1-g8bfc422)
- 开头的
+号表示:子模块当前工作区的Commit ID(8bfc422),与父仓库gitlink中记录的旧Commit ID(b39a213)不一致。 - 这个变化仅发生在子模块的本地工作区,父仓库的gitlink记录并未被自动修改——你可以在父仓库执行
git diff验证,会看到子模块目录显示为modified: sub-repo (new commits),这说明父仓库检测到了子模块的变化,但未将其纳入版本控制。
- 子模块新Commit的由来
你在子模块目录中提交时,子模块处于*分离HEAD(detached HEAD)*状态(父仓库初始化子模块时,会直接检出指定的Commit而非分支)。此时提交的新Commit仅存在于子模块本地,父仓库不会自动跟踪这个变化。如果要让父仓库记录这个新Commit,需要回到父仓库执行:
git add sub-repo git commit -m "update sub-repo to new commit 8bfc422"
内容的提问来源于stack exchange,提问作者StaY_Hungry
相关产品推荐
相关产品推荐

