在git-filter-branch上,它被称为:
要将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便将另一个历史记录粘贴到当前历史记录的后面:
git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
(如果父字符串为空-这在我们处理初始提交时发生-将graftcommit添加为父字符串)。
这正是我想要的,即设置一些根提交(
A
)的父级(提交B
)。有关相关问题,请参见here。但那个命令里的移植物身份证到底是什么?那是新父母吗,即
A
?此外,还提供了一个更简单的例子来实现同样的目的:
或者更简单:
echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD
同样,在这个例子中
$graft-id
应该是什么?以及$commit-id
=A
,对吗?或者是$commit-id
=B
和$graft-id
=A
?我也读过,但我还是不明白为什么我需要这样的概念。为什么我不能就这么做?
好吧,我想我已经想好了,看看我自己的答案。
为了解释我为什么需要它:
在我们的项目this中,我们一度包含了google breakpad。
我们并没有从官方的SVN(因为当时它对我不起作用)而是从最新的LastFM Stable(它只是随机的,从那里——我也有它在我的磁盘上,知道LastFM的人可能采取了一些稳定的BreakPad版本)。
然后,随着时间的推移,我们对自己的google breakpad应用了几个补丁。
现在,几个月后,我们想整理一下历史记录,对breakpad的所有补丁都有一个很好的概述,也许还会把它们放到上游。最重要的是(对我们来说),我们想更新我们的breakpad副本。
所以,我认为最好的做法是创建一个新的git存储库,从某个地方获取正式的源代码历史记录,并通过
git filter-branch A..HEAD
从我们的主存储库获取所有特定于breakpad的内容。我用OpenLieroX作为基础。git filter-branch
也有点复杂,因为我们曾经在openlierox存储库中移动了整个breakpad目录。所以我最终得到了三个分支:
filter-branch
:breakpad-in-mainsrc
-在breakpad处于git filter-branch
状态时首次运行。src/breakpad/external
:breakpad-in-libs
-在breakpad处于git filter-branch
时的第二次运行。libs/breakpad
:从this Breakpad mirror复制official
。然后我在
master
中搜索commit,它最接近official
中的根。我没有任何完美的匹配,所以我使用了最接近的一个(编写了一个小的python脚本来解决这个问题)。这个现在被标记为breakpad-in-mainsrc
。然后我想把这三段历史融合在一起。按照上面描述的方式进行(下面给出了我自己的答案)。
结果如下:Breakpad mirror
最佳答案
这是一个相当模糊的特征。
如果你需要这样做,你最好确保你清楚地知道git在幕后是如何工作的,你知道你想要实现什么。
此外,还有一个更新的、可能更有用的(至少是更灵活的)特征称为git replace
(man page)。
如果你真的需要的话,同样的文档包含了大量的信息。
但你看
https://git.wiki.kernel.org/index.php/GraftPoint
What are .git/info/grafts for?
http://bugsquash.blogspot.com/2010/03/stitching-git-histories.html