24.4 子树拆分
既然可以将一个代码库通过子树合并的方式作为子目录加入到另外一个版本库中,反之也可以将一个代码库的子目录独立出来转换为另外的版本库。不过这个反向过程非常复杂。要将一个版本库的子目录作为顶级目录导出到另外的项目,潜藏的条件是要导出历史,因为如果不关心历史,直接拷贝文件重建项目就可以了。子树拆分的大致过程是:
(1)找到要导出的目录的提交历史,并反向排序。
(2)依次对每个提交执行下面的操作。
(3)找出提交中导出目录对应的tree id。
(4)对该tree id执行git commit-tree。
(5)执行git commit-tree要保持提交信息还要重新设置提交的parents。
手工执行这个操作复杂且易出错,可以用下节介绍的git-subtree插件,或使用第6篇第35章的“35.4 Git版本库整理”一节中介绍的git filter-branch子目录过滤器的技术。