我不太了解git。 : - /
我有两个不相关的基于git的文档存储库,我想将它们合并到一个存储库中。我想保留原始时间戳(可追溯到2005年)和单个文件历史记录。这两个repos不包含分支,没有文件夹,并且在文件命名方面没有重叠。
在ASCII-land中,它看起来像这样:
REPO A |-------------------------|
REPO B |===============|
重叠表示时间。
我的目标是"拉链"重叠的时间戳,以便两个回购看起来像一个单一的,不间断的历史:
REPO A+B |-------------------==--=---============|
同样,我不太了解git,所以我可能搞砸了。
首先,我尝试将较新的较小的repo添加为较大的旧repo的远程,获取更改并提交结果。我结束了所有新的回购变更在旧仓库之后集中在一个分支中:
MERGE |------------------------- -|
\===============/
接下来我尝试使用--committer-date-is-author-date
)进行重新定位,我认为这样可行,但最终我得到了一个长的提交历史记录,只是将两个回购堆叠在一起。
REBASE |-------------------------===============|
我还没有找到一种方法来重播"结合的历史。我真的希望rebase就是答案。
答案 0 :(得分:7)
虽然@ codeWizard的回复很有帮助,但这种方法并没有按照我想要的方式保留时间戳。它确实让我陷入了一个帮助我找到解决方案的兔子洞......
创建一个新的空白存储库
git init
添加旧存储库并将其作为遥控器
获取git remote add -f oldRepoA ../oldRepoA
git remote add -f oldRepoB ../oldRepoB
按时间戳和散列导出合并的提交历史记录,将输出传递给sort
,通过cut
丢弃时间戳,然后将按时间顺序排序的散列列表传递给{{1}运行shell脚本以导出每个哈希的补丁,然后立即将补丁应用于新的仓库。
xargs
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)
你必须编写一个可以执行此操作的脚本。
获取每个分支的所有提交时间戳的列表
# print out the commits time stamp & sha-1 of each commit
# do it for all your branches
git log --oneline --format="%at %H"
将两个列表组合在一起,并使用任何排序工具(sublime,unix sort等)按时间戳排序
结帐新分支,开始您在文件中的第一次提交
git checkout <first commit id>
从此提交开始创建新分支
git checkout -b <new_branch_name>
遍历所有其他提交并使用cherry-pick将它们带入您的分支(脚本)
git cherry-pick <next commit id>