我有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
时,除了他们丢失的任何“新”历史记录外,他们还将获得一堆旧历史记录。
我想结合两个git repos,保持线性历史记录,并保持“较新”存储库的哈希值。如何使用已选择的历史记录(以上)或类似内容访问存储库?
答案 0 :(得分:2)
tl; dr
不,它无法完成。
详细信息
根据设计,在最初添加更多历史记录的同时保留哈希是不可能的。
提交的sha1哈希基于密码签名的概念:它不仅对提交及其内容,日期,提交者及其所有内容进行哈希处理,而且还对父级进行哈希处理,这意味着对哈希值进行哈希处理。导致提交的整个历史。
因此,如果不更改历史被扩展(或以任何其他方式修改)的每个提交的哈希,就无法更改历史。