Merge two Git repos and keep the history
我想扩展我的另一个问题:合并两个Git存储库并保留主历史记录
我已经成功地将两个不同的回购合并为一个回购。我需要一个钢筋网才能成功地做到这一点。主控形状是正确的,但我还想保留合并历史记录。这有可能吗?
我有两个存储库:
- 网址:https://github.com/dimitridewaele/repoa
- https://github.com/dimitridewaele/repob
。
氧化镁
这是重新平衡后的结果。顶部回购的时间是重新平衡的时间。原始日期丢失!
- https://github.com/dimitridewaele/repomerged
氧化镁
我就是这样做的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Assume the current directory is where we want the new repository to be created # Create the new repository git init # Before we do a merge, we have to have an initial commit, so we'll make a dummy commit dir > Read.md git add . git commit -m"initial commit" # Add a remote for and fetch the old RepoA git remote add -f RepoA https://github.com/DimitriDewaele/RepoA # Do the same thing for RepoB git remote add -f RepoB https://github.com/DimitriDewaele/RepoB # Rebase the working branch (master) on top of repoB git rebase RepoB/master # Rebase the working branch (master with RepoB) on top op repoA git rebase RepoA/master |
有没有可能有这样的东西?(喷漆解决方案!!!!)
氧化镁
我想保留原始时间+合并历史。
更新-答案
对我来说最有效的答案是利用嫁接点。但其他答案在其他用例中也非常有用。我在Github上添加了我的结果,所以每个人都可以评估。
回答1:在我的案例中,"嫁接"的确为我揭示了正确的工作答案。
Github:再移植
氧化镁
答案2"legec"中的"replace"选项对某些用例也有很好的效果。我有一个异常:
Github:回购历史记录
。
答案3:值得从"VONC"中添加答案。在我的案例中,我无法获得选项"--preserve merges working"。这可能在其他场景中有效,但我没有进一步测试。
正如您所发现的,
1 2 3 4 | git checkout master git replace --graft $(git log RepoB/master --format=%H | tail -1) HEAD git replace --graft $(git log RepoA/master --format=%H | tail -1) RepoB/master git reset --hard RepoA/master |
(
从技术上讲,如果您在
这些命令在
这个答案提出了另一种使用
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # start with a regular clone of the active repo : $ git clone RepoB # add repoA as a remote : $ git remote add -f history https://github.com/DimitriDewaele/RepoA # get hash of *initial* commit on repoB : $ git log --oneline origin/master | tail -1 abcdef Initial commit # get hash of last commit on repoA : $ git log --oneline history/master | head -1 12345 Merge branch 'develop' # use 'git replace' to tell git to stitch histories in the log : $ git replace abcdef 12345 |
。
注意:此操作是在您的计算机上完成的,而不是在远程存储库上完成的,因此应在所有新克隆上重复此操作。
变体:
您可以将
在Git Rebase中有两个选项应该会引起您的兴趣:
1 2 | p --preserve-merges |
Recreate merge commits instead of flattening the history by replaying commits a merge commit introduces.
号
1 | --committer-date-is-author-date |
号
(来自
By default the command records the date from the e-mail message as the commit author date, and uses the time of commit creation as the committer date. This allows the user to lie about the committer date by using the same value as the author date.
号
测试第二个钢筋是否不能产生更好的结果:
1 | git rebase -p --committer-date-is-author-date RepoA/master |