2010-01-20 11 views
7

Mi piacerebbe convertire un repository da Subversion a Mercurial, ma quando ho inizialmente impostato il repository, l'ho fatto nel modo più pigro possibile. Nel corso del tempo, la struttura ha continuato a trasformarsi e deteriorarsi (ha 5 anni a questo punto). Tuttavia, vorrei conservare il maggior numero possibile di cronologia, anche se devo sporcarmi e ricucire manualmente le cose insieme.Come migrare da Subversion a Mercurial quando la struttura trunk/branch/tag è un disastro?

Senza ulteriori indugi, l'attuale struttura si presenta in questo modo:

svn://svn.example.com/Example 
    + trunk 
     + BigProject 
     + BinaryDepedencies 
    + branches 
     + BigProject 
      + branch1 
      + feature1 
      + maintenance1 
      + ... 
    + tags 
     + BigProject 
      + tag1 
      + tag2 
      + ... 
    + projects 
     + small_project1 
     + small_project2 
     + small_project3 
     + ... 

Dato che questa è solo la struttura più recente, c'è qualche speranza per questo repository? Se non c'è speranza, chiunque ha un buon approccio per ricostruire la storia a mano in Mercurial (o bazar).

Inoltre, per vari motivi, non potrò usare git a meno che non ci sia una strategia a prova di proiettile per convertire questo repository specifico da Subversion a git a hg/bzr.

+0

Ci sarà presto una nuova buona risposta. reposurgeon sta crescendo la capacità di importare Subversion, e sembra come un sacco di cura e attenzione viene prestata a questa capacità: http://esr.ibiblio.org/?p=4071 – Omnifarious

risposta

7

Una strategia potrebbe essere quella di convertire il bagagliaio. Potresti dover giocare alcuni giochi se il tuo baule si è spostato, ma non dovrebbe essere troppo difficile.

Un altro strumento nel tuo arsenale potrebbe essere la conversione hg-> hg e l'estensione di rebase. Puoi usare quelli per giocherellare con il tuo albero dopo aver fatto cose in un repository hg e innestato sui rami dopo averli convertiti. O innestare nuovi pezzi della storia del tronco dopo il suo spostamento.

Ecco un collegamento alla documentazione su Mercurial rebase extension.

Fondamentalmente, ecco la strategia da seguire ... Innanzitutto, utilizzare convert extension o hgsvn per convertire parti del repository. Ciò può comportare più linee di trunk o rami che si trovano in un repository separato dalla linea principale.

Se si dispone di due sezioni di tronco in archivi separati e quello nella directory chiamata second segue direttamente l'uno nella directory chiamata first, si può fare questo:

cd second 
hg log -r 0 
# Note the revision hash 
cd ../first 
hg tip 
# Again, note the revision hash 
hg pull -f ../second 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip> 

Che vi innestare una sezione tronco su un'altra sezione del tronco.

Se si dispone di una filiale in un repository separato, la procedura è leggermente più complicato:

cd branch 
hg log -r 0 
# Note the revision hash 
cd ../trunk 
# Find the revision that the branch branches off from and note its hash. 
# We will call this revision the 'branch base'. 
hg pull -f ../branch 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base> 

Che vi innestare il ramo sull'albero principale.

+0

Ci può spiegare come innestare sui rami? L'idea hg-> hg sembra promettente. – user255063

+0

@throttled - Lì, ho fatto più di un tentativo di spiegare. :-) – Omnifarious

+0

Fantastico, grazie. Questo mi dà un po 'da masticare. – user255063

3

Secondo lo convert extension's docs, qualcosa del genere dovrebbe funzionare.

$ cat > ~/.hgrc <<EOF 
[extensions] 
hgext.convert= 
EOF 
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo 
+1

Molto bella suggestione, sembra che posso provare a utilizzare la stessa strategia per scindere i piccoli progetti nella loro repo. – user255063

Problemi correlati