2013-04-17 23 views
5

Voglio combinare un cvs e un repository svn in un nuovo repository git, senza perdere ovviamente la cronologia. Il problema è che la svn repo è una continuazione diretta del repository cvs in senso storico. Qualcuno ha appena creato il repository svn e ha aggiunto goffamente l'ultimo stato di cvs senza tenere traccia della cronologia. Le fonti più recenti sono in svn. Non voglio mantenere i vecchi repository.Unisci due cronologie di repository git

La storia nella grafica:

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

Quello che voglio:

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

ho fatto un repo git da CVS con cvs2git, e un altro git repo da SVN con git svn clone come indicato nella http://john.albin.net/git/convert-subversion-to-git ma non riesco a capire come combinare i due. Ho fatto questo:

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

Ora che cosa? git merge -s ours svn/master sembra fare quello che voglio, ma non crea una storia lineare:

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

Tutti gli esperimenti con git rebase non ha ottenuto da nessuna parte.

risposta

5

Utilizzare .git/info/grafts per collegare le cronologie e quindi git filter-branch per renderlo permanente. C'è una qualche descrizione di come qualcuno fatto: http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html

+0

Grazie mille, l'ha fatto. Non l'avrei mai trovato da solo. Pubblicherò una risposta come alla fine l'ho fatto. –

+0

@MichaelLemke Sì ... 'rebase' è un'aringa rossa - funziona con diffs e riapplica i changeset, mentre gli innesti consentono di manipolare direttamente il grafo della storia. – kan

+0

In realtà, non mi sono mai imbattuto in innesti prima (con git che è). –

2

Utilizzando quello che Kan ha scritto mi si avvicinò con questa soluzione:

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

Usa git log --all per trovare le storie non collegate:

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

Trova SHA1 completo:

git show 1985b93 
git show 12e0ed4 

Creare l'innesto:

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

Ora le storie sono collegate, ma non ancora definitiva:

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

renderla permanente, come mostrato nella http://bugsquash.blogspot.co.uk/2010/03/stitching-git-histories.html:

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

Questo crea nuovi commit, ma anche lascia il comando svn originale. git log --all mostrerà esso:

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

Rimuovere l'innesto, la storia duplicato sarà andato:

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

Clean up:

git reset --hard svnmaster 
git branch -D svnmaster 

e spingere:

git push 

Tutto fatto!