修改Git子模块URL并推送后,父仓库克隆异常的原因及解决
子模块重命名+URL修改后拉取更新报错的原因及解决方法
问题原因
- 子模块commit引用不匹配:
修改子模块URL的操作方执行git submodule update --remote后,仅更新了本地子模块的HEAD指向新仓库的最新提交,但父仓库PR中记录的SMX子模块commit哈希(cee0718a58c2f7dc4a8d29da5b9ede1354bc153c)仍然是旧SM仓库的提交。而新URL对应的仓库中不存在这个commit,因此执行git submodule update时会找不到该引用,触发报错。 - 旧子模块目录残留:
父仓库中旧子模块SM的条目已被移除,但Git不会自动清理工作区中的旧目录,因此本地会同时存在未更新的SM目录和空的SMX目录。
解决方法
本地临时修复(无需等待对方修改)
清理旧子模块残留
- 删除本地残留的
SM目录:rm -rf SM - 清理Git缓存中旧子模块的记录(若
git status仍显示SM相关变更):git rm --cached SM
- 删除本地残留的
修正SMX子模块的commit引用
- 进入
SMX目录,拉取新仓库的所有分支:cd SMX git fetch origin - 切换到新仓库的目标分支(如
main):git checkout main - 返回父仓库,更新子模块的commit引用并提交(若需要同步到远程):
cd .. git add SMX git commit -m "Fix submodule SMX to point to valid commit in new repo"
- 进入
重新同步并更新子模块
git submodule sync SMX git submodule update --init --recursive SMX
上游修正(让操作方完善提交)
如果需要从根源解决,让修改子模块的操作方执行以下步骤:
- 进入本地
SMX目录,拉取新仓库代码并切换到目标分支; - 返回父仓库,提交
SMX子模块的最新commit哈希; - 推送到远程PR仓库。
你拉取最新的PR更新后,再执行git submodule sync --recursive和git submodule update --init --recursive即可正常完成更新。
内容的提问来源于stack exchange,提问作者Cblue X
相关产品推荐
相关产品推荐

