首页/开发/Git 与协作速查/git subtree split 拆分目录历史
进阶与大仓实践69 条

git subtree split 拆分目录历史

把前缀目录的历史提取成一个独立分支(保留相关提交),可用于把目录拆成新仓库或作为回推中间产物。

Git 与协作速查开发更新于 2026-10-13

subtree split 是什么

git subtree split 把某个前缀目录的历史单独提取成一条提交链:只保留与目录相关的提交,生成一个独立分支,可用于把目录拆成新仓库,或作为 subtree push 回推的中间产物。它对历史做重建,产出提交的哈希与原历史不同(内容等价、对象不同)。大目录首次执行可能较慢,产出分支先核对再推送。

基本信息

语法git subtree split --prefix=<目录> [-b <分支>]
结果生成只含该目录历史的提交链
用途目录独立成仓、检查目录历史、回推中间产物
哈希重建提交,与原历史哈希不同
输出不加 -b 时直接打印结果提交哈希
性能大目录首次执行慢,产出分支可保存复用

典型使用场景

  • 拆库迁移:把公共目录拆出为独立仓库,保留其提交历史
  • 回推前置:subtree push 内部就是 split 后推送,手工先跑可检查产出
  • 历史检查:只看该目录曾经的全部提交,便于审计与统计
  • 多目标导出:拆分结果推送到镜像或社区仓库
  • 供应商模块:把第三方目录整理成干净历史交还上游
  • 排错定位:目录历史疑似异常时对比 split 产出

常用示例

常用示例
git subtree split --prefix=libs/common -b split/common   # 提取目录历史到独立分支
git log --oneline split/common | head                    # 检查提交链是否符合预期
git subtree split --prefix=libs/common                   # 不加 -b 时直接输出结果哈希
git push origin split/common:refs/heads/common-export    # 推送到新仓库或导出分支

产出要点

要点说明注意
提交范围只含触及该目录的提交混杂改动会带上无关历史
哈希变化重建产生新哈希文档标注新旧对应关系
路径不存在无法产出先核对 --prefix 拼写与位置
复用产出分支可重复用于审查与推送重新 split 会再生成一套
拆分结果可直接作为新仓库的初始历史;对大型目录首次执行可能较慢。
拆出独立仓库后要继续同步:仍靠 subtree pull/push 流程往返,别指望 split 结果自动跟随。
推送前先本地看 log 与文件清单,确认历史里没有旧路径下的密钥与大文件。

易错点

  • 哈希对不上:split 产出与原历史哈希不同,旧引用要在文档里明确替换关系
  • 混入无关历史:目录内混着非该模块的提交,拆分结果带上多余内容,事前先梳理
  • 把 split 当终点:拆完不设同步机制会分叉,往返流程要提前定好
  • 重复执行成本:大目录反复 split 很慢,产出分支保存复用
  • 导出前不审查:历史里可能残留敏感文件,推送到新仓库前先检查

数据来源与参考

  • Git 官方文档:git-subtree(split)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌