如何组合两个不相关的git存储库,保留历史记录

时间:2016-01-13 07:24:45

标签: git git-rebase

我不太了解git。 : - /

背景

我有两个不相关的基于git的文档存储库,我想将它们合并到一个存储库中。我想保留原始时间戳(可追溯到2005年)和单个文件历史记录。这两个repos不包含分支,没有文件夹,并且在文件命名方面没有重叠。

在ASCII-land中,它看起来像这样:

REPO A    |-------------------------|
REPO B                    |===============|

重叠表示时间。

目标

我的目标是"拉链"重叠的时间戳,以便两个回购看起来像一个单一的,不间断的历史:

REPO A+B  |-------------------==--=---============|

我尝试过什么

同样,我不太了解git,所以我可能搞砸了。

首先,我尝试将较新的较小的repo添加为较大的旧repo的远程,获取更改并提交结果。我结束了所有新的回购变更在旧仓库之后集中在一个分支中:

MERGE  |-------------------------                 -|
                                 \===============/

接下来我尝试使用--committer-date-is-author-date)进行重新定位,我认为这样可行,但最终我得到了一个长的提交历史记录,只是将两个回购堆叠在一起。

REBASE |-------------------------===============|

我还没有找到一种方法来重播"结合的历史。我真的希望rebase就是答案。

答案我看了

2 个答案:

答案 0 :(得分:7)

虽然@ codeWizard的回复很有帮助,但这种方法并没有按照我想要的方式保留时间戳。它确实让我陷入了一个帮助我找到解决方案的兔子洞......

  1. 创建一个新的空白存储库

    git init
    
  2. 添加旧存储库并将其作为遥控器

    获取
    git remote add -f oldRepoA ../oldRepoA
    git remote add -f oldRepoB ../oldRepoB
    
  3. 按时间戳和散列导出合并的提交历史记录,将输出传递给sort,通过cut丢弃时间戳,然后将按时间顺序排序的散列列表传递给{{1}运行shell脚本以导出每个哈希的补丁,然后立即将补丁应用于新的仓库。

    xargs
  4. git log --all --oneline --format="%at %H" | sort | cut -c12- | xargs -I {} sh -c 'git format-patch -1 {} --stdout | git am --committer-date-is-author-date' 是保持原始时间戳的关键。可能有更好的方法来做到这一点,但这对我的用例来说足够好了!

答案 1 :(得分:5)

你必须编写一个可以执行此操作的脚本。

怎么做

  1. 获取每个分支的所有提交时间戳的列表

    # print out the commits time stamp & sha-1 of each commit
    # do it for all your branches
    git log --oneline --format="%at %H"
    

    enter image description here

  2. 将两个列表组合在一起,并使用任何排序工具(sublime,unix sort等)按时间戳排序

  3. 结帐新分支,开始您在文件中的第一次提交

    git checkout <first commit id>
    

    enter image description here

  4. 从此提交开始创建新分支

    git checkout -b <new_branch_name>
    
  5. 遍历所有其他提交并使用cherry-pick将它们带入您的分支(脚本)

    git cherry-pick <next commit id>