我试图弄清楚Git中的"移植物"是什么.
例如,在这里的一个最新评论中,Tobu假设使用git-filter-branch和.git/info/grafts来连接两个存储库.
但我不明白为什么我需要这些移植物?似乎所有工作都没有最后两个命令.
来自Git Wiki:
移植点或移植物使得两个不同的开发线能够连接在一起.它的工作原理是让用户记录提交的伪造祖先信息.通过这种方式,您可以使git假装提交的父项集与创建提交时记录的不同.
使用移植物的原因
将开发移动到git时,移植可能很有用,因为它允许您克隆从另一个SCM可选项导入的旧历史.这为那些只想关注最新版本的用户保留了初始克隆,而开发人员可以获得完整的开发历史记录.
当Linus开始使用git来维护他的内核树时,没有任何工具可以转换旧的内核历史记录.之后,当旧的内核历史从bkcvs网关导入git时,创建了移植物作为一种方法,可以将两个不同的存储库绑定在一起.
Chris Johnsen 提到的用于加入两个存储库的移植方法不再完全有效(仅使用移植物).
使用Git 2.18(2018年第二季度)," " 的功能已被" "机制取代(现在已经有一段时间了).
内部代码在许多地方都支持它,为了放弃对"移植"机制的支持,这些代码已被清理
.$GIT_DIR/info/grafts
refs/replace/
见提交a3694d9,提交f42fa47,提交8d0d81a,提交e2d65c1,提交f9f99b3,提交0115e03,提交fb40429,提交041c98e,提交e24e871(2018年4月28日),以及提交d398f2e,提交fef461e,提交c5aa6db(2018年4月25日)由约翰Schindelin (dscho
).
(由Junio C gitster
Hamano合并- -在提交352cf6c,2018年5月23日)
而不是
echo "$commit-id $graft-id" >> .git/info/grafts
你现在做:
git replace --graft $commit-id $graft-id git filter-branch $graft-id..HEAD
弃用支持
.git/info/grafts
移植物特征是一种方便的方式,将古代历史"缝合在一起"的新起点
linux.git
.然而,它的实现不符合Git的标准,因为它有太多的方式可以导致令人惊讶和不受欢迎的行为.
例如,当从具有活动移植物的存储库推送时,可能会错过已经"移植"的提交,从而导致另一端的破坏状态.
此外,移植功能仅限于"重写"提交的父母列表,它不能替代任何其他内容.
实施的更年轻的功能是
git replace
为了弥补这些限制和危险的错误.眼见为
git replace
是相当成熟的现在(因为4228e8b (更换:添加--graft
选项,2014年7月19日,Git的2.1.0),它可以进行移植文件的职责),现在是时候弃用对移植文件支持,并退最终.
现在(再次,Git 2.18,2018年第二季度),你有:
replace
:添加--graft
选项此选项的用法字符串是:
git replace [-f] --graft[ ...] 首先,我们创建一个与
其父项相同的新提交
[
...] 然后我们创建一个替换ref替换为我们刚创建的提交.
使用这个新选项,转换移植物以替换refs应该是直截了当的.
在Git 2.20(Q8 2018)之前,最近引入的提交图辅助数据与诸如替换和移植等"破坏"对象引用关系的不可变特性的机制不兼容.
在存储库中使用这些不兼容的功能时,根据其使用(以及更新现有的提交图)禁用优化.
请参阅Derrick Stolee()提交829a321,提交5cef295,提交20fd6d5,提交d653824,提交b775896,提交950c62b(2018年8月20日).
请参阅Stefan Beller()提交212e0f7,提交4a6067c(2018年8月20日).(由Junio C Hamano合并- -在提交6d8f8eb,2018年10月16日)derrickstolee
stefanbeller
gitster
使用git-svn时:
git grafts对于将Git树导入Subversion存储库非常有用.
例如,我创建了一个本地Git存储库作为开始.经过几天的工作,创建了很多提交,我不得不将它发布到中央Subversion存储库中,我不想丢失历史记录.
我找到了以下How-to文章:http: //eikke.com/importing-a-git-tree-into-a-subversion-repository/