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

Mac端Git子模块git fetch无法拉取GitHub最新提交的解决方案

根本原因

核心问题是origin远程仓库的拉取地址和推送地址错配,指向了两个完全独立的GitHub仓库:

  • Git对远程仓库的配置逻辑是:url字段为fetch/pull等拉取操作的默认访问地址,pushurl字段仅在执行push操作时生效,二者可以独立配置指向不同地址。
  • 你当前配置里,origin的拉取地址是git@github.com:upstream/myrepo.git(上游公共仓库),但推送地址是git@github.com:personal/myrepo.git(你的个人fork仓库)。
  • Windows端提交后执行push,代码实际被上传到了个人fork仓库;Windows本地本身就存着刚写的提交,不需要拉取就能看到最新内容,因此你之前没发现配置问题。
  • Mac端执行git fetch origin时,实际请求的是上游upstream仓库,自然读不到你存在个人fork里的最新提交。你之前的临时方案能生效,本质就是把提交推到了拉取操作实际访问的upstream仓库,和这个逻辑完全吻合。
  • 其余子模块、主仓库没有同类问题,是因为这些仓库没有配置分离的拉取/推送地址,不存在地址指向不一致的问题。
可行修复与强制拉取方案

按长期可用性排序:

  • 永久修复:统一origin的拉取和推送地址
    进入故障子模块目录,执行命令将origin的拉取地址修改为你实际推送代码的个人fork地址:
    git remote set-url origin git@github.com:personal/myrepo.git
    
    修改完成后执行git fetch origin即可正常拉取到最新提交,后续完全不需要依赖upstream仓库的写入权限。如果需要同步上游公共仓库的更新,直接用你已经配置好的upstream远程执行git fetch upstream即可。
  • 临时拉取:不修改配置直接指定源地址
    如果不想调整现有配置,拉取时直接指定个人fork的地址绕过默认配置即可:
    git fetch git@github.com:personal/myrepo.git +refs/heads/*:refs/remotes/origin/*
    
    拉取完成后切换到目标分支,执行git merge origin/mybranch-name即可将最新提交合入本地分支。
  • 异常兜底:同步子模块配置缓存
    如果执行完前两个方案仍无法拉取,回到主仓库根目录检查.gitmodules文件中对应子模块的url配置,如果该字段写的是upstream仓库地址,同步修改为个人fork地址后执行以下命令刷新子模块配置缓存:
    git submodule sync --recursive
    
    部分场景下Git会优先读取主仓库记录的子模块地址,覆盖子模块目录下的本地配置,同步缓存后即可恢复正常。

内容的提问来源于stack exchange,提问作者rpatters1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:24:18