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

如何修复Git subtree rev-parse split推送失败问题

Git子树推送失败修复指南(SourceTree用户版)

问题背景

我用SourceTree操作分支,Git基础薄弱,遇到了子树推送失败的问题:

  • 主仓库:/nav.git,当前分支NAV-482
  • 子树:对应远程仓库/nav.dll.git的NAV-482-DLL分支,本地路径/名称是nav.dll
  • 现象:拉取子树变更正常,但推送时报错:

git push using: nav.dll.git NAV-482-DLL
fatal: remote error: upload-pack: not our ref 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd
fatal: the remote end hung up unexpectedly
fatal: could not rev-parse split hash 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd from commit 872b637c702ca5f45b41bdecbded976b47313b23

报错里的872b637c702ca5f45b41bdecbded976b47313b23是2017年的旧提交,4fb3fa1d...是对应的git-subtree-split哈希。试过git fetch nav.dll.git 4fb3fa1d...,但远程仓库根本没有这个提交。

解决方案

1. 用git subtree split --ignore-joins --rejoin修复

命令作用解释

  • split:重新拆分主仓库里nav.dll路径的提交历史,生成独立的提交序列
  • --ignore-joins:跳过历史中合并子树的操作,不再依赖那个不存在的旧split哈希
  • --rejoin:把新拆分的提交合并回主仓库,更新本地子树的关联信息,让后续推送能识别正确的哈希

具体操作步骤

首先切换到主分支NAV-482:

git checkout NAV-482

然后执行拆分命令(必须在主仓库根目录下运行):

git subtree split --ignore-joins --rejoin --prefix=nav.dll NAV-482-DLL
  • --prefix=nav.dll:指定要处理的子树本地路径
  • NAV-482-DLL:子树远程仓库对应的目标分支

完成后再推送子树:

git subtree push --prefix=nav.dll nav.dll.git NAV-482-DLL

2. SourceTree UI操作方法

SourceTree没有直接的可视化按钮执行subtree split,但可以通过内置终端操作:

  1. 打开SourceTree,切换到NAV-482分支
  2. 点击顶部菜单栏的「终端」按钮,调出命令行窗口
  3. 把上面的命令依次输入执行即可

3. 备选重置方案(如果上面的方法无效)

如果还是失败,可以彻底重置子树关联:

  1. 先把本地nav.dll目录的修改备份到别处,防止丢失
  2. 移除本地子树:
git rm -r nav.dll
git commit -m "临时移除nav.dll子树"
  1. 重新添加子树,拉取远程最新状态:
git subtree add --prefix=nav.dll nav.dll.git NAV-482-DLL
  1. 把备份的修改复制回nav.dll目录,提交后再推送:
git add nav.dll
git commit -m "恢复nav.dll子树修改"
git subtree push --prefix=nav.dll nav.dll.git NAV-482-DLL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:33:17