5

我想将 cvs 和 svn 存储库合并到一个新的 git 存储库中,当然不会丢失历史记录。问题是 svn 回购是 cvs 回购历史的直接延续。有人刚刚创建了 svn repo,然后笨拙地添加了 cvs 的最后一个状态,没有保留任何历史记录。最新的资源在 svn 中。我不想保留旧的回购。

图形的历史:

CVS: A - B - C
SVN: D - E - F - G

我想要的是:

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

我用 cvs2git 从 cvs 制作了一个 git repo,从 svn 制作了另一个 git repo,如http://john.albin.net/git/convert-subversion-to-gitgit svn clone中所述,但只是不知道如何结合二。我这样做了:

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都没有让我到任何地方。

4

2 回答 2

5

用于.git/info/grafts连接历史,然后git filter-branch使其永久化。有一些描述有人如何做到这一点: http: //bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

于 2013-04-17T10:58:30.457 回答
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

全部做完!

于 2013-04-17T13:29:21.963 回答