【问题标题】:How to combine two git repos, preserving the history of both, and the hashes of one?如何结合两个 git repos,保留两者的历史,以及一个的哈希?
【发布时间】:2019-07-18 03:09:55
【问题描述】:

我有什么

我有readmanySOquestionsaboutcombiningrepositories。我快到了,但我错过了一些东西。

我有两个存储库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-ing,但只重写了current-repo历史的哈希值。我也不想这样我不在乎 old-repo 的历史是否被重新散列。正如我所提到的,该 repo 没有发布和共享。基本上,下次我的用户执行git fetch 时,除了他们缺少的任何“新”历史记录之外,他们还会得到一堆旧历史记录。

tl;博士

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

【问题讨论】:

    标签: git repository


    【解决方案1】:

    tl;dr

    不,不能这样做。

    详情

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

    提交的 sha1 哈希基于加密签名的概念:它不仅对提交及其内容、日期、提交者等进行哈希处理,而且还对其中的父项进行哈希处理,这意味着它对导致该提交的整个历史记录。

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

    【讨论】:

    • 我也是这么想的。哦,好吧...给了我一个重新组织回购的借口!
    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 2017-06-28
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多