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

如何组合两个不相关的git存储库,保存历史,git,git-rebase,Git,Git Rebase,我对git不太了解。:-/ 背景 我有两个不相关的基于git的文档存储库,我想将它们合并到一个存储库中。我想保留原始的时间戳(可以追溯到2005年)和单个文件历史记录。这两个回购协议不包含分支机构、文件夹,在文件命名方面也没有重叠 在ASCII land中,它看起来如下所示: REPO A |-------------------------| REPO B |===============| 其中重叠表示时间 目标 我的目标是“拉上”重叠的时间戳,

我对git不太了解。:-/

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

在ASCII land中,它看起来如下所示:

REPO A    |-------------------------|
REPO B                    |===============|
其中重叠表示时间

目标 我的目标是“拉上”重叠的时间戳,使两个回购看起来像一个单一的、完整的历史:

REPO A+B  |-------------------==--=---============|
我试过的 再说一次,我对git不太了解,所以我可能把事情搞砸了

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

MERGE  |-------------------------                 -|
                                 \===============/
接下来,我尝试了重定基址(使用
——提交人日期是作者日期),我认为这会起作用,但我最终得到了一个很长的提交历史,两个回购协议堆叠在一起

REBASE |-------------------------===============|
我还没有找到一种方法来“重播”组合的历史。我真的希望rebase会是答案

我看过的答案
  • (#1)
  • (#2以上,没有“拉链”历史记录)

    • 您必须编写一个脚本来完成此任务

      怎么做
    • 获取每个分支的所有提交时间戳的列表

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

    • 将两个列表组合在一起,并使用任何排序工具(升华、unix排序等)按时间戳对它们进行排序

    • 签出新分支,开始文件中的第一次提交

      git checkout <first commit id>
      
      git签出
      

    • 从此提交开始创建新分支

      git checkout -b <new_branch_name>
      
      git签出-b
      
    • 循环所有其他提交,并使用cherry pick将它们引入分支(脚本)

      git樱桃采摘
      

    • 尽管@codeWizard的回答很有帮助,但这种方法并没有按照我想要的方式保留时间戳。它确实把我带进了一个兔子洞,帮我找到了解决办法

    • 创建一个新的空白存储库

      git init
      
    • 以远程方式添加和获取旧存储库

      git remote add -f oldRepoA ../oldRepoA
      git remote add -f oldRepoB ../oldRepoB
      
    • 按时间戳和哈希导出组合的提交历史,将输出传送到
      排序
      ,通过
      cut
      丢弃时间戳,然后将按时间顺序排序的哈希列表传送到
      xargs
      ,它运行一个shell脚本,为每个散列导出一个补丁,然后立即将补丁应用于新的repo

      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'
      

    • --提交者日期是作者日期
      是保留原始时间戳的关键。也许有更好的方法可以做到这一点,但这对于我的用例来说已经足够好了

      如果使用合并方法,
      git log--date order
      将按您要求的提交时间显示提交顺序,
      git log--date order--graph
      也将显示分支树。@code向导的建议发生了什么?每个cherry pick是否将提交日期设置为当前日期时间?是的,但是存储库是相似的,所以我不知道它是否能工作。是的,这最终导致
      X:已存在于工作目录中,补丁在0001失败。这是否适用于具有多个分支(如
      master
      develope
      )的存储库?这是否适用于具有相同文件结构的两个存储库,但其中一个存储库是另一个存储库的后期分叉快照?我是
      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'