Git subtree出现段错误,提交同步失败求助
解决git subtree split段错误及同步无提交问题
问题根源
添加--rejoin选项后生成的合并提交,导致subtree的历史关联逻辑复杂化,git-subtree脚本处理这些合并提交时出现异常,引发段错误,同时无法正确识别需要同步的提交内容。
解决步骤
1. 在bundle仓库生成干净的子项目历史
首先找到添加--rejoin之前最后一次正常同步的提交哈希(记为OLD_SYNC_COMMIT),可通过git log --grep="subtree.*projA"筛选历史同步提交定位。
基于该提交重新生成无异常的子项目分支:
cd src/large-repo git subtree split -P projA -b clean-projA-split --onto OLD_SYNC_COMMIT
2. 修复独立仓库的历史
进入独立仓库,将干净的分支内容覆盖到目标分支:
cd ../subtree/projA git fetch ../large-repo clean-projA-split git checkout main_ST git reset --hard FETCH_HEAD git push -f origin main_ST
注意:强制推送会覆盖独立仓库现有历史,操作前务必备份。
3. 重建bundle仓库与独立仓库的subtree关联
回到bundle仓库,清理临时分支并重新建立关联:
cd ../large-repo git branch -D clean-projA-split git subtree pull --rejoin -P projA ../subtree/projA main_ST
4. 后续同步的标准流程
之后同步时,需在push和pull时均使用--rejoin,确保历史关联正确且同步高效:
cd src/large-repo git subtree push --rejoin -P projA ../subtree/projA main_ST git subtree pull --rejoin -P projA ../subtree/projA main_ST git push
注意事项
- 所有操作前请备份bundle仓库和独立仓库,防止数据丢失
- 若段错误仍出现,可尝试升级git版本(部分旧版本git-subtree存在已知bug)
- 避免在subtree同步过程中混用
--squash和--rejoin,保持同步逻辑一致
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

