gpt4 book ai didi

git - 如何 merge 两个不相关的 git 存储库,保留历史

转载 作者:太空狗 更新时间:2023-10-29 12:46:06 24 4
gpt4 key购买 nike

我不太了解git。 :-/

背景

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

在 ASCII 领域,它看起来像这样:

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

重叠部分表示时间。

目标

我的目标是“压缩”重叠的时间戳,使两个存储库看起来像一个完整的历史记录:

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

我尝试过的

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

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

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

接下来我尝试 rebase (使用 --committer-date-is-author-date),我认为这会起作用,但我最终得到了一个很长的提交历史,它只是堆叠了两个相互叠加。

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

我一直没能找到一种方法来“重播” merge 后的历史记录。我真的希望 rebase 会是答案。

我看过的答案

最佳答案

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

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

    git init
  2. 添加和获取旧存储库作为远程

    git remote add -f oldRepoA ../oldRepoA
    git remote add -f oldRepoB ../oldRepoB
  3. 按时间戳和哈希导出 merge 的提交历史,将输出通过管道传输到sort,通过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'

--committer-date-is-author-date 是保持原始时间戳的关键。可能有更好的方法来执行此操作,但这对我的用例来说已经足够好了!

关于git - 如何 merge 两个不相关的 git 存储库,保留历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34760674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com