Git:什么是移植物提交或移植物id?

Git:什么是移植物提交或移植物id?,git,git-filter-branch,Git,Git Filter Branch,关于这一点,据说: 要将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便将其他历史记录粘贴到当前历史记录后面,请执行以下操作: git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD 同样,在这个例子中,$graftID应该是什么?和$commit id=A,对吗?或者是$commit id=B和$graft id=A 我也读过,但我还是不明白为什么我需要这样一个概

关于这一点,据说:

要将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便将其他历史记录粘贴到当前历史记录后面,请执行以下操作:

git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
同样,在这个例子中,
$graftID
应该是什么?和
$commit id
=
A
,对吗?或者是
$commit id
=
B
$graft id
=
A

我也读过,但我还是不明白为什么我需要这样一个概念。为什么我不能只做
git过滤器分支A..HEAD
左右


好吧,我想我都明白了,看看我自己的答案

为了解释我为什么需要它:

在我们的项目中,我们有一次将Google Breakpad包括在内

我们没有从官方的SVN(因为当时它对我不起作用)获取它,而是从最新的LastFM stable中获取(从那里获取的只是随机的——我的磁盘上也有它,并且知道LastFM的人可能使用了一些稳定的Breakpad版本)

然后,随着时间的推移,我们在自己的Google Breakpad副本上应用了几个补丁

现在,几个月后,我们想清理一下历史记录,对Breakpad的所有补丁有一个很好的概述,也许还可以把它们放到上游。最重要的是(对我们来说),我们希望更新Breakpad的副本

因此,我认为最好的办法是创建一个新的Git存储库,从某个地方获取正式的源代码历史记录,并通过
Git filter branch
将所有与Breakpad相关的内容从我们的主存储库中获取。我用它作为基地。
过滤器分支
也有点复杂,因为我们将整个Breakpad目录移动到OpenLieroX存储库中的一个点上

所以我最终得到了三个分支:

  • mainsrc中的breakpad
    git过滤器分支
    -在breakpad位于
    src/breakpad/external
    时首次运行
  • libs中的breakpad
    git过滤器分支
    -在breakpad位于
    libs/breakpad
    时第二次运行
  • official
    :从中复制
    master
然后我在
official
中搜索commit,它最接近mainsrc中
breakpad的根。我没有得到任何完美的匹配,所以我使用了最接近的匹配(编写了一个小Python脚本来解决这个问题)。这一个现在被标记为
olx最近的初始断块

然后我想把这三段历史合并在一起。按照上面描述的方式进行(并在下面给出我自己的答案)


结果如下:

这是一个相当模糊的特性

如果您需要这个,您最好加倍确保您确切地知道git在幕后是如何工作的,并且您知道您想要实现什么

另外,还有一个更新的、可能更有用(至少更灵活)的特性,叫做
git replace
()

如果你真的需要的话,同样的文档包含了丰富的信息

但是看到了吗


  • 好的,它似乎按照我预期的方式工作。回答我自己的问题:

    • 嫁接id实际上只是一个提交id,即提交的SHA1
    • $commit id
      =
      B
      (它必须是一个SHA1,没有标签等等)
    • $graft id
      =
      A
      (同样,必须是SHA1)

    然后,给定的更简单的方法会像预期的那样工作。

    是的,我理解Git是如何工作的。它的工作原理与预期完全相同。看看我自己的答案。我补充了一些我为什么需要它的解释。如果你自己回答这个问题,分享你的一些知识和解释你在做什么可能是有意义的。在重写历史和移植点方面有很多特别的注意事项(你不能撤消对分支的过滤以使移植永久化)@sehe:我现在用一些背景信息扩展了我的问题。你确定要重写历史吗?这意味着,如果您发现一个与
    breakpad
    相关的bug,并且您想了解它是什么时候出现的,那么这可能是不可能的,因为您提供的原始代码已经不存在了。
    echo "$commit-id $graft-id" >> .git/info/grafts
    git filter-branch $graft-id..HEAD