Git:什么是移民提案或移民身份?

时间:2011-05-22 14:30:22

标签: git git-filter-branch

git-filter-branch上,据说:

  

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

git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
     

(如果父字符串为空 - 在我们处理初始提交时发生 - 将graftcommit添加为父级)。

这正是我想要的,即设置某个根提交(A)的父(提交B)。有关相关问题,请参阅here

但该命令中的 graft-id 究竟是什么?这是新的父母,即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,但我仍然不明白为什么我需要这样一个概念。为什么我不能只做git filter-branch A..HEAD左右?


好吧,我想我已经全力以赴,看看我自己的答案。

解释我需要它的原因:

在我们的项目OpenLieroX中,我们一度包含Google Breakpad。

我们没有从官方的SVN中取出它(因为它当时对我来说没有用)但是从最新的LastFM稳定版(它只是随机的是来自那里 - 我也有它我的磁盘并且知道LastFM人员可能采用了一些稳定的Breakpad版本。)

然后,当时间过去了,我们将几个补丁应用到我们自己的Google Breakpad副本中。

现在,几个月之后,我们想要清理一下历史记录,对Breakpad的所有补丁进行一个很好的概述,也可能让它们上游。最重要的是(对我们而言),我们想要更新我们的Breakpad副本。

所以,我认为最好的方法是创建一个新的Git存储库,从某个地方获取官方源历史记录,并通过git filter-branch从我们的主存储库中获取所有Breakpad特定的东西。我使用this Breakpad mirror作为基础。 filter-branch也有点复杂,因为我们将整个Breakpad目录移动到OpenLieroX存储库中的一个点。

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

  • breakpad-in-mainsrcgit filter-branch - 首次出现在Breakpad位于src/breakpad/external的时间。
  • breakpad-in-libsgit filter-branch - 第二次运行时,Breakpad位于libs/breakpad
  • official:来自Breakpad mirror。{/ li>的master的副本

然后我在official中搜索了最接近breakpad-in-mainsrc根的提交。我没有得到任何完美的匹配,所以我使用了最接近的一个(写了一个小的Python脚本来解决这个问题)。这个标签现在标记为olx-closest-initial-breakpad

然后我想将这三个历史合并在一起。这很好用,如上所述(并在下面给出了我自己的答案)。

结果在这里:OpenLieroX Google Breakpad on GitHub

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

这是一个相当模糊的功能。

如果你需要这个,你最好再确定你确切知道git在幕后是如何工作的,你知道你想要达到的目的。

此外,有一个更新的,可能更有用(至少更灵活)的功能称为git replaceman page

恕我直言,相同的文档包含足够的信息,你真的需要这个。

但请参阅

  1. https://git.wiki.kernel.org/index.php/GraftPoint
  2. What are .git/info/grafts for?
  3. http://bugsquash.blogspot.com/2010/03/stitching-git-histories.html