关于存储库:如何组合两个git repos,保留两者的历史,以及一个哈希?

How to combine two git repos, preserving the history of both, and the hashes of one?

我有什么

我读过很多关于组合存储库的问题。我快到了,但我错过了一些东西。

我有两个存储库current-repo,它是发布和共享的,而old-repo,它不是。我只有一份。他们的历史看起来有点像

1
2
3
4
5
                         1--2--3--4--5  <= current-repo
                         =
                content is the same
                         =
old-repo =>  a--b--c--d--e

我想要什么

理想情况下,通过合并两个回购,我将得到一个具有类似历史的回购

1
1. a--b--c--d--1--2--3--4--5  <= notice, duplicate old entry"e" is dropped"

我也同意以下内容:

1
2
3
2. a--b--c--d--e--1--2--3--4--5            <= duplicate content in"e" and"1"
3. foo--bar--baz--buz--1--2--3--4--5       <= like #1 above, but rehashed"old" history
4. foo--bar--baz--buz--bif--1--2--3--4--5  <= like #4, but"bif" and"1" have duplicate content

我试过的

我可以(在本地)通过

1
2
3
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-repoget的历史是否被重新处理过。正如我提到的,回购协议没有发布和共享。基本上,下一次我的用户使用git fetch时,除了他们丢失的"新"历史之外,他们还会得到一堆旧的历史。

DR

我想结合两个git repo,维护一个线性历史,并维护"更新的"存储库的散列。如何到达具有所选历史(上面)或类似历史的存储库?


DR

不,不可能。

细节

通过设计,在开始添加更多历史记录的同时保留散列是不可能的。

提交的sha1散列基于加密签名的思想:它不仅散列提交及其内容、日期、提交者和所有这些内容,而且散列父对象,这意味着它散列导致提交的整个历史。

因此,如果不更改历史被扩展(或以任何其他方式修改)的每个提交的哈希,就无法更改历史。