Git:什么是graftcommit或graft-id?

4
git-filter-branch上说:

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。
  • officialBreakpad镜像master的副本。
  • 然后我在 breakpad-in-mainsrc 中搜索与根最接近的 official 提交。我没有找到完全匹配的,所以我使用了最接近的一个(编写了一个小的Python脚本来找出它)。现在这个被标记为 olx-closest-initial-breakpad
    然后我想把这三个历史记录全部合并在一起。按照上面描述的方法进行,这个过程很顺利(并且给出了我的答案)。
    结果在这里:OpenLieroX Google Breakpad on GitHub

    你确定要重写历史吗?这意味着如果你发现与breakpad相关的错误,并且想要了解它何时出现,可能是不可能的,因为你所发布的原始代码已经消失了。 - Elazar Leibovich
    2个回答

    4

    好的,看起来它的工作方式符合我的预期。回答我的问题:

    • graft-id 实际上就是提交 ID,即提交的 SHA1 值。
    • $commit-id = B(它必须是 SHA1 值,不能是标签等)
    • $graft-id = A(同样,必须是 SHA1 值)

    然后给出的更简单的方法按预期工作。


    如果您自己回答这个问题,分享一些您的知识并解释“您正在做什么”可能是有意义的。历史重写和嫁接点有许多注意事项(您无法撤消对分支进行过滤以使嫁接永久化)。 - sehe
    1
    @sehe:我现在已经加入了一些背景信息来扩展我的问题。 - Albert

    2

    是的,我理解Git的工作原理。它的工作方式与预期完全相同。请查看我的答案。我添加了一些说明为什么我需要它。 - Albert

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接