Fusiona dos historias de repository git

Quiero combinar un cvs y un repository svn en un nuevo repository git, sin perder el historial, por supuesto. El truco es que el svn repo es una continuación directa del repo de cvs históricamente. Alguien acaba de crear el svn repo y agregó torpemente el último estado de cvs sin save ningún historial. Las fonts más recientes están en svn. No quiero conservar los viejos repositorys.

La historia en charts:

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

Lo que quiero:

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

Hice un repo de git de cvs con cvs2git, y otro repo de git de svn con git svn clone como se describe en http://john.albin.net/git/convert-subversion-to-git pero simplemente no puedo entender cómo para combinar los dos. Hice esto:

 git clone cvs.git cd cvs git remote add svn ../../svn.git git fetch svn 

¿Ahora que? git merge -s ours svn/master parece hacer lo que quiero, pero no crea un historial lineal:

 A - B - C - - - H' / D - E - F - G / 

Cualquier experimento con git rebase no me llevó a ninguna parte.

Usa .git/info/grafts para conectar historiales y luego git filter-branch para hacerlo permanente. Hay alguna descripción de cómo alguien lo hizo: http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

Usando lo que Kan escribió, se me ocurrió esta solución:

 git clone cvs.git cd cvs git remote add svn ../../svn.git git fetch svn 

Use git log --all para encontrar los historiales no relacionados:

 ... | * 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] | ... 

Encuentra el SHA1 completo:

 git show 1985b93 git show 12e0ed4 

Crea el injerto:

 echo 1985b9305ebc819e760f7ecf8e2abe7963eac055 12e0ed4c3dd75cec396a2d228825702eab73ba19 > .git/info/grafts 

Ahora las historias están conectadas pero aún no son permanentes:

 | * 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] | 

Hazlo permanente como se muestra en http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html :

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

Esto crea nuevas confirmaciones pero también deja las confirmaciones de svn originales. git log --all lo mostrará:

 * 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] | 

Eliminar el injerto, el historial duplicado se habrá ido:

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

Limpiar:

 git reset --hard svnmaster git branch -D svnmaster 

Y empuje:

 git push 

¡Todo listo!