如何修复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,但可以通过内置终端操作:
- 打开SourceTree,切换到
NAV-482分支 - 点击顶部菜单栏的「终端」按钮,调出命令行窗口
- 把上面的命令依次输入执行即可
3. 备选重置方案(如果上面的方法无效)
如果还是失败,可以彻底重置子树关联:
- 先把本地
nav.dll目录的修改备份到别处,防止丢失 - 移除本地子树:
git rm -r nav.dll git commit -m "临时移除nav.dll子树"
- 重新添加子树,拉取远程最新状态:
git subtree add --prefix=nav.dll nav.dll.git NAV-482-DLL
- 把备份的修改复制回
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
相关产品推荐
相关产品推荐

