子模块远程地址及提交更新后Git Pull失败的解决方法咨询
解决嵌套子模块远程URL更新后的开发者同步问题
核心问题原因
你遇到的fatal: remote error: upload-pack: not our ref $hash错误,本质是本地子模块仍指向旧远程仓库,而旧仓库中不存在主仓库新指定的子模块提交哈希。只需同步子模块远程配置并从新仓库拉取提交即可解决,无需删除子模块文件夹。
无需删除文件夹的干净解决流程
执行以下命令序列即可完成同步:
拉取主仓库最新代码,获取子模块URL和目标提交的更新
git pull递归同步所有子模块(包括嵌套的moduleB)的远程URL到本地配置
git submodule sync --recursive让每个子模块从新远程拉取所有提交(包含目标哈希),同时清理旧远程的无效引用
git submodule foreach --recursive 'git fetch --prune'初始化并递归更新所有子模块到主仓库指定的版本
git submodule update --init --recursive
脚本/别名化方案
Git 别名配置
在本地.gitconfig文件中添加以下别名,之后只需执行git submodule-update-remote即可完成全部操作:
[alias] submodule-update-remote = !git pull && git submodule sync --recursive && git submodule foreach --recursive 'git fetch --prune' && git submodule update --init --recursive
Bash 脚本
创建update-submodules.sh文件,赋予执行权限后运行:
#!/bin/bash set -e echo "拉取主仓库最新代码..." git pull echo "同步所有子模块远程URL..." git submodule sync --recursive echo "从新远程获取所有提交..." git submodule foreach --recursive 'git fetch --prune' echo "更新所有子模块到指定版本..." git submodule update --init --recursive echo "子模块更新完成!"
执行权限赋予命令:chmod +x update-submodules.sh
为什么之前的方法需要删除文件夹?
git submodule deinit --all -f会移除子模块的本地Git配置和工作区内容,相当于重置子模块状态;而你后来删除文件夹的操作本质是强制让Git重新从新远程拉取内容。但通过上述流程,我们无需破坏现有子模块文件夹,只需同步远程配置并拉取新提交,就能让Git找到对应的哈希值,完成正常更新。
内容的提问来源于stack exchange,提问作者hapatch
相关产品推荐
相关产品推荐

