执行git submodule update始终指向旧提交无法使用最新版本如何解决
问题成因
- 问题根源是操作时XLS文件被其他程序加了独占锁,Git无法完成旧文件的删除替换,导致父仓库中记录子模块版本的gitlink索引没有被正确更新。Git子模块的指向版本完全由父仓库根目录存储的gitlink特殊对象决定,和子模块本身的分支HEAD无关:你看到子模块main分支的
HEAD已经是最新的713a39e提交,但父仓库里存的子模块绑定哈希还是旧的7e4dc23值,因此每次执行git submodule update都会按照父仓库的记录检出旧提交,自动进入detached状态。 - 之前手动修改子模块HEAD、给子模块提交空commit的操作没有生效,是因为问题并不出在子模块本身,而是父仓库的gitlink记录没有更新。
修复步骤
- 先关闭占用对应XLS文件的程序,确认文件没有被锁定,避免后续操作再次出现
Couldn't unlink报错。 - 进入父仓库根目录,执行以下命令更新父仓库的子模块绑定记录:
# 进入子模块目录,切换到最新的main分支 cd data git checkout main git pull origin main # 回到父仓库目录,提交新的子模块绑定哈希 cd .. git add data git commit -m "update submodule data to latest commit"
- 验证修复结果:执行
git submodule update,此时不会再检出旧的7e4dc23提交,子模块也不会再自动回到detached状态。 - 如果上述操作后仍有异常,可以先清理子模块的异常缓存再重新初始化:
# 父仓库根目录执行 git submodule deinit -f data rm -rf .git/modules/data git submodule update --init --remote data
后续规避方案
- 操作包含子模块的仓库前,先确认子模块内的Office文档、工程文件等容易被加独占锁的文件没有被其他程序打开。
- 子模块内的内容提交推送完成后,必须回到父仓库执行
git add 子模块路径,提交更新后的gitlink记录,不要只在子模块内操作。 - 执行Git操作时如果出现
Couldn't unlink类的警告,立刻停止后续操作,先解除文件锁定后重新执行刚才的操作,确认没有警告输出后再继续,避免留下隐性的异常状态。
内容的提问来源于stack exchange,提问作者Martim Passos
相关产品推荐
相关产品推荐

