Git子模块场景下git status状态异常问题咨询
问题描述
我刚在项目中添加了mysql-server作为子模块,操作步骤如下:
ls -la # 获取文件列表 git submodule add mysql-server # 完整URL已省略 cd mysql-server # 未执行任何提交或暂存操作 git checkout tags/mysql-8.0.27 # 切换至8.0.27系列的最新提交 cd .. # 准备提交以使用该指定TAG git status
执行git status后,发现暂存区包含.gitmodules和mysql-server/,同时出现未暂存变更:
Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: mysql-server (new commits)
请问该现象原因是什么?提交后该提示会消失吗?是否需要将其加入暂存区?
解答
现象原因
- 父仓库中的子模块是一个特殊的追踪文件,它存储的是子模块当前指向的具体commit哈希值。添加子模块时,父仓库暂存区的
mysql-server条目默认关联的是子模块仓库当时HEAD指向的commit(也就是master分支的最新提交)。 - 当你进入子模块切换到
mysql-8.0.27标签后,子模块本地的HEAD指向了该标签对应的commit,这个commit和父仓库暂存区中记录的哈希值不匹配,因此git会提示mysql-server (new commits),表示子模块的当前提交与父仓库记录的引用不一致。
提交后提示是否会消失?
不会。当前暂存区中的mysql-server条目还是最初添加子模块时关联的master分支commit,提交后父仓库记录的依然是这个旧的commit哈希值,但子模块本地处于mysql-8.0.27标签的commit上,两者仍不匹配,所以git status依然会显示该未暂存变更。
是否需要将其加入暂存区?
需要。你需要执行git add mysql-server命令,更新父仓库中mysql-server这个子模块引用,让它指向mysql-8.0.27标签对应的commit。执行该命令后,这个未暂存变更会消失,此时再提交,就能将父仓库与子模块的对应版本关系固定下来。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

