将两个Git仓库的历史记录合并

5
我希望将一个cvs和svn仓库合并成一个新的git仓库,当然不能丢失历史记录。问题是svn仓库在历史上直接延续了cvs仓库。有人创建了svn仓库,并笨拙地添加了最后一个cvs状态,没有保留任何历史记录。最近的源代码在svn中。我不想保留旧的仓库。 图形化的历史记录如下:
CVS: A - B - C
SVN: D - E - F - G

我需要的是:

GIT: A - B - C - D - E - F - G

我使用cvs2git从cvs制作了一个git repo,又使用git svn clone根据http://john.albin.net/git/convert-subversion-to-git中的说明从svn制作了另一个git repo,但是我无法弄清楚如何将这两个repo合并。我尝试了以下操作:

git clone cvs.git
cd cvs
git remote add svn ../../svn.git
git fetch svn
现在怎么办?git merge -s ours svn/master似乎可以实现我的要求,但是它不能产生线性的历史记录。
A - B - C - - - H'
               /
D - E - F - G /
任何使用git rebase进行的实验都没有让我有所进展。
2个回答

5

非常感谢,这就解决了。我自己永远找不到这个问题的答案。我会发布一个回答,说明我最终是如何解决的。 - mplwork
@MichaelLemke 是的... rebase 是一个误导 - 它使用差异并重新应用变更集,而嫁接允许直接操作历史图。 - kan
实际上,我以前从未遇到过grafts(使用git的时候)。 - mplwork

2
使用Kan编写的方法,我得出了这个解决方案:
git clone cvs.git
cd cvs
git remote add svn ../../svn.git
git fetch svn
使用git log --all命令查找未连接的历史记录:
...
|
* ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS [svnuser]

* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|
...

查找完整的SHA1:

git show 1985b93
git show 12e0ed4
创建嫁接点:
echo 1985b9305ebc819e760f7ecf8e2abe7963eac055 12e0ed4c3dd75cec396a2d228825702eab73ba19 > .git/info/grafts
现在历史记录已连接但尚未永久保存:
|
* ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS (grafted) [svnuser]
|
* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|

按照http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html所示,使其永久化:

git branch svnmaster svn/master
git filter-branch -- 12e0ed4c3dd75cec396a2d228825702eab73ba19..svnmaster

这会创建新的提交,但原始的svn提交还保留着。执行 git log --all 命令可以查看它:

* 849278b 2013-04-15 16:31:44 +0000 | Java 6 in Eclipse.  Deployed. (svnmaster) [svnuser]
|
...
|
* c33f7cc 2011-09-14 06:03:07 +0000 |  [svnuser]
|
* 7acb3ed 2011-09-14 06:00:00 +0000 | Migration from CVS [svnuser]
|
| * b3d5413 2013-04-15 16:31:44 +0000 | Java 6 in Eclipse.  Deployed. (svn/master, refs/original/refs/heads/svnmaster) [svnuser]
| |
...
| |
| * ab42f52 2011-09-14 06:03:07 +0000 |  [svnuser]
| |
| * 1985b93 2011-09-14 06:00:00 +0000 | Migration from CVS (grafted) [svnuser]
|/
|
* 12e0ed4 2011-09-14 05:58:10 +0000 | *** empty log message *** (HEAD, origin/master, origin/HEAD, master) [cvsuser]
|
* 5060a7f 2011-04-18 14:07:03 +0000 | *** empty log message *** [cvsuser]
|

移除移植物,副本历史将被删除:

rm -r .git/info/grafts .git/refs/original

清理:

git reset --hard svnmaster
git branch -D svnmaster

并推送:

git push

全部完成!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,