如何合并两个git repos,同时保留两个历史和一个哈希值?

时间:2019-02-24 16:21:00

标签: git repository

我所拥有的

我有read many SO questions about combining repositories。我快到了,但是我想念一些东西。

我有两个存储库current-repo,它们已发布和共享,而没有old-repo。我有唯一的副本。他们的历史看起来像

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

我想要的

理想情况下,通过结合使用两个存储库,我将获得具有类似历史记录的存储库

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

我也愿意满足以下条件:

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

我尝试过的

我可以通过本地方式达到这一点

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时,除了他们丢失的任何“新”历史记录外,他们还将获得一堆旧历史记录。

tl; dr

我想结合两个git repos,保持线性历史记录,并保持“较新”存储库的哈希值。如何使用已选择的历史记录(以上)或类似内容访问存储库?

1 个答案:

答案 0 :(得分:2)

tl; dr

不,它无法完成。

详细信息

根据设计,在最初添加更多历史记录的同时保留哈希是不可能的。

提交的sha1哈希基于密码签名的概念:它不仅对提交及其内容,日期,提交者及其所有内容进行哈希处理,而且还对父级进行哈希处理,这意味着对哈希值进行哈希处理。导致提交的整个历史。

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