Git子模块提交值存储位置及父仓库与子模块版本同步问询
子模块提交值的存储位置与版本同步方案
子模块提交值的存储位置
父仓库中记录子模块对应提交的关键位置有两个:
- 父仓库根目录的
.gitmodules文件:这是子模块的配置文件,仅记录子模块的远程仓库地址、本地路径等基础信息,不存储具体的提交哈希。 - 父仓库的Git对象数据库与提交历史:当你在父仓库中提交子模块更新时,子模块目录会被Git标记为特殊的
gitlink对象,该对象中保存了子模块当前指向的提交哈希。这个对象存储在父仓库的.git/objects/目录下的Git对象库中,你可以通过以下命令直接查看父仓库当前版本关联的子模块提交哈希:
另外,子模块自身的完整Git数据(包括提交记录、分支状态)会存在父仓库的git ls-tree HEAD SUBMODULE_NAME.git/modules/SUBMODULE_NAME/目录下,但父仓库用来绑定固定版本的是提交到自身历史中的gitlink值。
父仓库特定版本与子模块版本同步的方法
要让父仓库的特定版本和对应的子模块版本完全同步,按以下步骤操作:
- 切换到父仓库的目标版本:
使用git checkout命令切换到父仓库的特定提交、标签或分支:git checkout <父仓库提交哈希/标签名/分支名> - 同步子模块到对应版本:
执行以下命令,子模块会自动检出父仓库当前版本所关联的特定提交:
如果子模块存在本地未提交的修改,需要强制覆盖同步的话,添加git submodule update --checkout--force参数:git submodule update --checkout --force - 首次克隆时直接同步(可选):
若首次克隆父仓库就需要同步到特定版本的子模块,可以在克隆时添加--recurse-submodules参数:
或者克隆完成后,先初始化子模块再同步:git clone --recurse-submodules -b <父仓库分支/标签> <父仓库远程地址>git submodule init git submodule update --checkout
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

