在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-mainsrc
:git filter-branch
- 首次出现在Breakpad位于src/breakpad/external
的时间。breakpad-in-libs
:git filter-branch
- 第二次运行时,Breakpad位于libs/breakpad
。official
:来自Breakpad mirror。{/ li>的master
的副本
然后我在official
中搜索了最接近breakpad-in-mainsrc
根的提交。我没有得到任何完美的匹配,所以我使用了最接近的一个(写了一个小的Python脚本来解决这个问题)。这个标签现在标记为olx-closest-initial-breakpad
。
然后我想将这三个历史合并在一起。这很好用,如上所述(并在下面给出了我自己的答案)。
答案 0 :(得分:4)
好吧,它似乎按我预期的方式工作。回答我自己的问题:
$commit-id
= B
(它必须是SHA1,没有标签等)$graft-id
= A
(同样,必须是SHA1)然后给定的更简单的方法按预期工作。
答案 1 :(得分:2)
这是一个相当模糊的功能。
如果你需要这个,你最好再确定你确切知道git在幕后是如何工作的,你知道你想要达到的目的。
此外,有一个更新的,可能更有用(至少更灵活)的功能称为git replace
(man page)
恕我直言,相同的文档包含足够的信息,你真的需要这个。
但请参阅