2013-04-17 5 views
5

Je veux combiner un dépôt cvs et un dépôt svn dans un nouveau repo git, sans perdre l'historique bien sûr. La prise est le svn repo est une continuation directe du repo cvs historywise. Quelqu'un vient de créer le svn repo et a maladroitement ajouté le dernier état de cvs sans garder aucun historique. Les sources les plus récentes sont dans svn. Je ne veux pas garder les vieux repos.Fusionner deux historiques de référentiel git

L'histoire dans les graphiques:

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

Ce que je veux:

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

J'ai fait un git de cvs avec cvs2git, et un autre git de svn avec git svn clone comme indiqué dans http://john.albin.net/git/convert-subversion-to-git mais Je n'arrive pas à comprendre comment combiner les deux. Je l'ai fait:

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

Maintenant quoi? git merge -s ours svn/master semble faire ce que je veux, mais ne crée pas une histoire linéaire:

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

Les expériences avec git rebase ne me mènera nulle part.

Répondre

5

Utilisez .git/info/grafts pour connecter les historiques, puis git filter-branch pour le rendre permanent. Il y a une certaine description comment quelqu'un fait cela: http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

+0

Merci beaucoup, c'est ce que j'ai fait. Je n'aurais jamais trouvé ça moi-même. Je posterai une réponse comment je l'ai finalement fait. –

+0

@MichaelLemke Oui ... 'rebase' est un refrain rouge - il fonctionne avec les diffs, et réapplique les changesets, alors que les greffes permettent de manipuler directement le graphe de l'historique. – kan

+0

En fait, je n'ai jamais rencontré de greffes avant (avec git c'est). –

2

En utilisant ce kan écrit je suis venu avec cette solution:

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

Utilisez git log --all pour trouver les histoires sans lien:

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

Trouver le plein SHA1:

git show 1985b93 
git show 12e0ed4 

Créer la greffe:

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

Maintenant, les histoires sont connectées mais pas encore permanent:

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

le rendre permanent comme indiqué dans http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html:

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

Cela crée de nouveaux commits mais aussi quitte l'original svn commits. git log --all va montrer:

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

Retirez la greffe, l'histoire double aura disparu:

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

Nettoyage:

git reset --hard svnmaster 
git branch -D svnmaster 

Et pousser:

git push 

Terminé!

Questions connexes