如何合并两个git仓库,保留两者的历史记录和一个仓库的哈希值?

17 浏览
0 Comments

如何合并两个git仓库,保留两者的历史记录和一个仓库的哈希值?

我拥有的内容

我已经阅读了很多关于合并git仓库的SO问题。我已经接近成功,但还有一些问题。

我有两个仓库current-repo,已发布和共享,以及old-repo,未发布且只有一份拷贝。它们的历史看起来是这样的:

1--2--3--4--5 <= current-repo

=

内容相同

=

old-repo => a--b--c--d--e

我想要的

理想情况下,通过合并这两个仓库,我希望得到一个具有以下历史的仓库:

1. a--b--c--d--1--2--3--4--5  <= 注意,重复的旧条目"e"被删除"

我也可以接受以下情况:

2. a--b--c--d--e--1--2--3--4--5            <= "e"和"1"中有重复内容
3. foo--bar--baz--buz--1--2--3--4--5       <= 类似于上面的#1,但重新计算了"old"的历史
4. foo--bar--baz--buz--bif--1--2--3--4--5  <= 类似于#4,但"bif"和"1"具有重复内容

我尝试过的

我可以通过以下步骤(在本地)达到这一点:

cd ~/current-repo
git remote add -f old-repo ~/old-repo
git replace -f --graft 1 d

现在,我理解的是此时我需要推送/拉取refs/replace/*。但我不希望我的用户进行这一步骤。

我看到的git graft(或许还有一些git replace)解决方案中,都有一个git filter-branch步骤。我尝试了这个方法,还尝试了git rebase,但只有current-repo历史中的哈希被重新编写了。我也不希望这样。我不在乎old-repo的历史是否被重新哈希。正如我之前提到的,该仓库并未发布和共享。基本上,当我的用户下次执行git fetch时,他们将得到大量旧的历史,除了他们可能错过的任何"新"历史。

简而言之

我希望合并两个git仓库,保持线性历史,并保持"较新"仓库的哈希。如何获得我所选择的历史(如上所示)或类似的历史?

0
0 Comments

如何合并两个git仓库,同时保留两者的历史和哈希值

问题的原因:无法保留哈希值,因为哈希值是基于整个历史记录计算的,无法单独修改某个提交的哈希值。

解决方法:无法直接合并两个仓库并保留哈希值,但可以通过重新组织仓库的方式来实现。

详细内容:

Git的哈希值是基于加密签名的理念,它不仅对提交和其内容、日期、提交者等进行哈希计算,还将父提交包括在内,这意味着它要对导致该提交的整个历史进行哈希计算。

因此,如果更改历史记录,就需要更改每个扩展历史记录的提交的哈希值(或以其他方式修改)。

所以,无法在保留哈希值的同时添加更多历史记录。

我也想到了这一点。嗯...这给了我一个重新组织仓库的借口!

0