¿Cómo se importan las twigs de git en mercurial con la conversión de hg?

Tengo varias sucursales en un repository de git:

david@Panama ~/app: git branch -r origin/HEAD -> origin/master origin/master origin/newButtons origin/newFonts origin/serverView 

Si bash importar este git repo en mercurial:

 david@Panama ~/: hg convert app ... david@Panama ~/app-hg: hg update 388 files updated, 0 files merged, 0 files removed, 0 files unresolved david@Panama ~/app-hg: hg branches default 1148:6d04af619607 

Parece que las twigs se han "perdido" (en términos de que ya no están separadas) y de hecho se fusionaron en la punta:

 david@Panama ~/app-hg: hg log changeset: 1148:6d04af619607 tag: tip user: convert-repo date: Mon Nov 16 17:57:06 2009 +0000 summary: update tags changeset: 1147:742e7a01a6c9 parent: 1144:bff259181b22 user: user1 date: Sat Nov 14 17:47:09 2009 +0000 summary: Playing around with fonts to get a cleaner look changeset: 1146:162c1b0dd648 parent: 1144:bff259181b22 user: user1 date: Fri Nov 13 21:12:21 2009 +0000 summary: Playing with new server view changeset: 1145:aa06857832ab user: user1 date: Sat Nov 14 13:54:12 2009 +0000 summary: Updated buttons to something more fitting changeset: 1144:bff259181b22 user: David Mytton <david@mytton.net> date: Fri Nov 13 10:35:51 2009 +0000 summary: Example 

Dado que ese es el caso:

a) ¿Estoy haciendo algo mal para importar las sucursales aquí?

b) ¿Pueden las twigs realmente importarse?

Esto es por layout. Las twigs de Git importadas solo están labeldas en Mercurial, y las hg heads deberían darle la cantidad correcta de "twigs" importadas.

Como se menciona en este hilo :

Considera un tree que se ve así:

  oooooob <- branch foo / -ooa \ ooc <- branch bar 

¿En qué twig están "a" y sus antepasados?
No tenemos la menor pista. De hecho, los únicos sets de cambios de los que tenemos alguna certeza son b nd c porque los nombres de las twigs no son parte del historial.

Asi que:

Resulta que en realidad es imposible hacerlo bien, porque git no almacena suficiente información.
Considere un repository con dos twigs en git, cada una con un número de confirmaciones.
Como git no registra en qué twig se originó cada confirmación, no hay suficiente información en el tree para labelr cada set de cambios.
Un usuario de git puede intercambiar los nombres de las dos twigs y no se registra nada para decir que alguna vez fue diferente. Si dos twigs tienen un ancestro común (y seguramente lo harán), ¿en qué twig está el antepasado? No lo sabemos

Lo mejor que podemos hacer en el caso general es labelr cada cabecera de twig como si estuviera en esa twig. Entonces, si realiza una conversión incremental, probablemente haremos lo correcto. Pero el concepto de twigs de git no es perfecto para hg, por lo que esta conversión tampoco será perfecta.


Puedes probarlo con un pequeño repo de Git (Git 1.6.5.1, Hg1.3.1):

 PS C:\Prog\Git\tests> cd .\hgimport PS C:\Prog\Git\tests\hgimport> git init gitRepoToImport PS C:\Prog\Git\tests\hgimport> cd .\gitRepoToImport PS [...]\gitRepoToImport> echo firstContentToBr1 > br1.txt PS [...]\gitRepoToImport> echo firstContentToBr2 > br2.txt PS [...]\gitRepoToImport> echo firstContentToBr3 > br3.txt PS [...]\gitRepoToImport> git add -A PS [...]\gitRepoToImport> git commit -a -m "first content, to be evolved in three different branches" 

Haga un montón de modificaciones en tres twigs separadas:

 PS [...]\gitRepoToImport> git checkout -b br1 PS [...]\gitRepoToImport> echo firstEvolutionInBr1 >> .\br1.txt PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 1" PS [...]\gitRepoToImport> echo secondEvolutionInBr1 >> .\br1.txt PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 1" PS [...]\gitRepoToImport> git checkout master PS [...]\gitRepoToImport> git checkout -b br2 PS [...]\gitRepoToImport> echo firstEvolutionInBr1 >> .\br2.txt PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 2" PS [...]\gitRepoToImport> git checkout master PS [...]\gitRepoToImport> git checkout -b br3 PS [...]\gitRepoToImport> echo firstEvolutionInBr3 >> .\br3.txt PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 3" PS [...]\gitRepoToImport> echo secondEvolutionInBr3 >> .\br3.txt PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 3" PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br3.txt PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 3" PS [...]\gitRepoToImport> git checkout br2 PS [...]\gitRepoToImport> echo secondEvolutionInBr2 >> .\br2.txt PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 2" PS [...]\gitRepoToImport> git checkout br1 PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br1.txt PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 1" PS [...]\gitRepoToImport> git checkout br2 PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br2.txt PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 2" 

Luego, clone ese repository de Git (por si acaso, para otras testings masculinas)

 PS [...]\gitRepoToImport> cd .. PS C:\Prog\Git\tests\hgimport> git clone .\gitRepoToImport gitRepoToImport1 

Configura tu ~/.hgrc con un formatting UTF-8 sin BOM ~/.hgrc un rato en hacerlo bien!)

 [extensions] hgext.convert = 

Luego haz la conversión

 PS C:\Prog\Git\tests\hgimport> hg convert .\gitRepoToImport1 hgRepo PS C:\Prog\Git\tests\hgimport> cd .\hgRepo PS C:\Prog\Git\tests\hgimport\hgRepo> hg heads 

Obtendrás las tres "twigs" esperadas

 changeset: 9:ad0884395ada tag: tip user: VonC date: Mon Nov 16 21:45:35 2009 +0100 summary: third evolution in branch 2 changeset: 6:854bc6537c7c user: VonC date: Mon Nov 16 21:45:19 2009 +0100 summary: third evolution in branch 1 changeset: 3:9194cf25d3ca user: VonC date: Mon Nov 16 21:44:09 2009 +0100 summary: third evolution in branch 3