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.gitgit 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会优先读取主仓库记录的子模块地址,覆盖子模块目录下的本地配置,同步缓存后即可恢复正常。git submodule sync --recursive
内容的提问来源于stack exchange,提问作者rpatters1
相关产品推荐
相关产品推荐

