在git-过滤器-分支上,有人说:
将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便粘贴当前历史后面的其他历史记录: git过滤器-分支-父过滤器'sed‘s/^$/-p/“头 (如果父字符串为空--这是在处理初始提交时发生的-将graftcommit添加为父字符串)。
这正是我想要的,即设置某个根提交(B)的父级(提交)。有关相关问题,请参见这里。
但这条命令中的嫁接标识到底是什么?是新父母,即A吗?
此外,还提供了一个更简单的例子来实现同样的目标:
或者更简单: 回显"$commit-id $graft id“>> . git /info/grafts过滤器-分支$graft id
同样,在这个例子中,$graft-id应该是什么呢?$commit-id = A,对吗?还是$commit-id = B和$graft-id = A
我也读过这,但我仍然不明白为什么我需要这样的概念。为什么我不能直接做git filter-branch A..HEAD之类的呢?
好吧,我想我都想通了,看看我自己的答案。
来解释我为什么需要它:
在我们的OpenLieroX项目中,我们曾经有过谷歌的突破版。
我们没有从官方的SVN (因为它当时对我不起作用),而是从最新的LastFM马厩(它只是随机的,是从那里--我也有它在我的磁盘上,并知道LastFM的人可能采取了一些稳定的突破垫版本)。
然后,随着时间的推移,我们应用了几个补丁到我们自己的谷歌突破垫副本。
现在,几个月后,我们想要清理一下历史,得到一个很好的概述,我们所有的补丁到突破垫,也许还能让他们上游。最重要的是(对我们),我们想更新我们的副本的突破垫。
因此,我认为最好的方法是创建一个新的Git存储库,从其中获取正式的源历史,并通过git filter-branch将主存储库中的所有特定内容从主存储库中获取。我用这面碎垫镜子作为基地。filter-branch也要复杂一些,因为我们在OpenLieroX存储库中的某个点移动了整个早餐垫目录。
所以我得到了三个分支:
breakpad-in-mainsrc:git filter-branch-在src/breakpad/external的时候先运行。breakpad-in-libs:git filter-branch-在libs/breakpad的时候运行第二次。official:master从断路镜复制而来。然后,我在official中搜索提交,它最接近breakpad-in-mainsrc中的根。我没有得到任何完美的匹配,所以我使用了最接近的一个(编写了一个小Python脚本来解决这个问题)。这一个现在被标记为olx-closest-initial-breakpad。
然后我想把这三段历史合并在一起。就像上面描述的那样(下面给出了我自己的答案)。
发布于 2011-05-22 14:49:13
这是一个相当模糊的特性。
如果您需要这样做,您最好加倍确保您确切地知道git在幕后是如何工作的,并且您知道您想要实现什么。
此外,还有一个新的、可能更有用(至少更灵活)的特性叫做git replace (手册页)。
IMHO,同样的文档包含了充足的信息,如果你真的需要这个。
但你看
发布于 2011-05-22 15:00:25
好吧,它似乎像我所期望的那样工作。回答我自己的问题:
$commit-id = B (虽然它必须是一个SHA1,但没有标记)$graft-id = A (同样,必须是SHA1)然后,所给出的更简单的方法如预期的那样工作。
https://stackoverflow.com/questions/6088551
复制相似问题