You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子模块远程地址及提交更新后Git Pull失败的解决方法咨询

解决嵌套子模块远程URL更新后的开发者同步问题

核心问题原因

你遇到的fatal: remote error: upload-pack: not our ref $hash错误,本质是本地子模块仍指向旧远程仓库,而旧仓库中不存在主仓库新指定的子模块提交哈希。只需同步子模块远程配置并从新仓库拉取提交即可解决,无需删除子模块文件夹。

无需删除文件夹的干净解决流程

执行以下命令序列即可完成同步:

  1. 拉取主仓库最新代码,获取子模块URL和目标提交的更新

    git pull
    
  2. 递归同步所有子模块(包括嵌套的moduleB)的远程URL到本地配置

    git submodule sync --recursive
    
  3. 让每个子模块从新远程拉取所有提交(包含目标哈希),同时清理旧远程的无效引用

    git submodule foreach --recursive 'git fetch --prune'
    
  4. 初始化并递归更新所有子模块到主仓库指定的版本

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:06:10