41.4 嫁接和替换

41.4.1 提交嫁接

提交嫁接可以实现在本地版本库上将两条完全不同的提交线(分支)嫁接(连接)到一起。对于一些在迁移版本控制系统时遇到困难的项目,该技术会非常有帮助。例如Linux kernel本身的版本控制系统在迁移到Git上时,尚没有任何工具可以将Linux的提交历史从旧的Bitkeeper版本控制系统中导出,直到后来通过bkcvs将Bitkeeper上的Linux历史提交导入到Git中。如何将新旧两条开发线连接到一起呢?于是就发明了提交嫁接,以实现新旧两条开发线的合并,这样Linux开发者就可以在一个开发分支中由最新的提交追踪到原来位于Bitkeeper中的提交[1]

提交嫁接是通过在版本库中创建.git/info/grafts文件来实现的。该文件每一行的格式为:


<commit sha1><parent sha1>[<parent sha1>]*


用空格分开各个字段,其中第一个字段是一个提交的SHA1哈希值,而后面用空格分开的其他SHA1哈希值则作为该提交的父提交。把一个提交线的根节点作为第一个字段,第二个提交线的顶节点作为第二个字段,就实现了两个提交线的嫁接,看起来就像是一条提交线了。

在本书第6篇第35章的“35.4 Git版本库整理”中介绍的git filter-branch命令在整理版本库时,如果发现存在.git/info/grafts则会在物理上完成提交的嫁接,实现嫁接的永久生效。

[1]https://git.wiki.kernel.org/index.php/GraftPoint