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