这正是我想要的,即设置某个根提交(To set a commit (which typically is at the tip of another history) to be the parent of the current initial commit, in order to paste the other history behind the current history:
git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
(if the parent string is empty - which happens when we are dealing with the initial commit - add graftcommit as a parent).
B
)的父级(到提交A
)。有关问题,请参见此处。但是,该命令中的graft-id是什么?那是新的父级,即
A
吗?此外,还给出了一个更简单的示例来实现相同的目的:
or even simpler:
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,但我仍然不太明白为什么我需要这样的概念。为什么我不能只做 git filter-branch A..HEAD
或类似的操作呢?
好的,我想我已经全部弄清楚了,可以看看我的回答。
解释一下我为什么需要它:
在我们的项目OpenLieroX中,曾经有一段时间包含了Google Breakpad。
我们没有从官方SVN(因为当时对我来说不起作用)中获取,而是从最新的LastFM稳定版本中获取(只是随意选择的 -- 我也在我的磁盘上有它,并知道LastFM的人可能使用了一些稳定的Breakpad版本)。
然后,随着时间的推移,我们对自己的Google Breakpad副本应用了几个补丁。
现在,许多月后,我们想要清理一下历史记录,对我们对Breakpad的所有补丁进行概述,可能还要将它们上游。 最重要的是(对于我们来说),我们想要更新我们的Breakpad副本。
因此,我认为最好的方法是创建一个新的Git存储库,从某个地方获取官方源代码历史记录,并通过git filter-branch
将我们主要存储库中的所有Breakpad特定内容复制到其中。我使用这个Breakpad镜像作为基础。由于我们曾经在OpenLieroX存储库内部移动整个Breakpad目录,所以filter-branch
也有点复杂。因此,我最终得到了三个分支:
breakpad-in-mainsrc
:Breakpad位于src/breakpad/external
时的git filter-branch
-first-run。breakpad-in-libs
:Breakpad位于libs/breakpad
时的git filter-branch
-second-run。official
:Breakpad镜像的master
的副本。breakpad-in-mainsrc
中搜索与根最接近的 official
提交。我没有找到完全匹配的,所以我使用了最接近的一个(编写了一个小的Python脚本来找出它)。现在这个被标记为 olx-closest-initial-breakpad
。然后我想把这三个历史记录全部合并在一起。按照上面描述的方法进行,这个过程很顺利(并且给出了我的答案)。
结果在这里:OpenLieroX Google Breakpad on GitHub
breakpad
相关的错误,并且想要了解它何时出现,可能是不可能的,因为你所发布的原始代码已经消失了。 - Elazar Leibovich