【发布时间】:2011-05-22 14:30:21
【问题描述】:
在git-filter-branch上,据说:
将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便将其他历史记录粘贴到当前历史记录后面:
git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD(如果父字符串为空 - 当我们处理初始提交时会发生这种情况 - 添加 graftcommit 作为父字符串)。
这正是我想要的,即设置某些根提交(B)的父级(提交A)。有关相关问题,请参阅 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-first-run 为 Breakpad 在src/breakpad/external中的时间。 -
breakpad-in-libs:git filter-branch-second-run 为 Breakpad 在libs/breakpad中的时间。 -
official:来自Breakpad mirror 的master的副本。
然后我在official 中搜索了与breakpad-in-mainsrc 中的根最接近的提交。我没有完美匹配,所以我使用了最接近的一个(写了一个小的 Python 脚本来解决这个问题)。这个现在被标记为olx-closest-initial-breakpad。
然后我想将这三个历史合并在一起。上面描述的方式很好(下面给出了我自己的答案)。
【问题讨论】:
-
您确定要重写历史记录吗?这意味着,如果您发现与
breakpad相关的错误,并且您想了解它是什么时候出现的 - 这可能是不可能的,因为您发布的原始代码已经消失了。
标签: git git-filter-branch