Git子模块为何持续以分离头指针模式更新?
子模块重复拉取旧提交的解决方法
1. 彻底清理旧子模块残留
git rm不会完全清除子模块的所有配置,需要手动清理以下内容:
- 编辑主仓库根目录的
.gitmodules文件,删除[submodule "Modules/GLFW"]开头的整个段落 - 打开
.git/config文件,删除所有包含submodule.Modules/GLFW的配置项 - 删除主仓库内的
.git/modules/Modules/GLFW目录(这是Git存储子模块元数据的路径,旧数据会残留)
2. 重新添加子模块(可选指定跟踪分支)
如果希望子模块自动跟踪远程分支,添加时用-b参数指定分支(比如作者仓库的main分支):
git submodule add -b main git@github.com:me/glfw.git Modules/GLFW
若不需要跟踪分支,直接执行基础添加命令即可:
git submodule add git@github.com:me/glfw.git Modules/GLFW
3. 更新主仓库的子模块引用
添加完成后,提交主仓库的配置变更和新的子模块引用:
git add .gitmodules Modules/GLFW git commit -m "更新GLFW子模块为作者复刻版本"
4. 验证并拉取最新内容
执行以下命令确认子模块拉取新仓库的内容:
git submodule update --init --recursive --remote
--remote参数会强制子模块拉取远程仓库的最新提交,而非主仓库记录的旧哈希。
补充处理分离头状态
如果子模块仍处于分离头状态,可手动切换到目标分支并更新:
cd Modules/GLFW git checkout main # 替换为作者仓库的目标分支名 git pull cd .. git add Modules/GLFW git commit -m "同步GLFW子模块到最新分支提交"
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

