2009-11-16 8 views
17

J'ai un certain nombre de branches dans un dépôt git:Comment les branches git sont-elles importées dans mercurial avec hg convert?

[email protected] ~/app: git branch -r 
origin/HEAD -> origin/master 
origin/master 
origin/newButtons 
origin/newFonts 
origin/serverView 

Si j'essaie d'importer ce git dans Mercurial:

[email protected] ~/: hg convert app 
... 
[email protected] ~/app-hg: hg update 
388 files updated, 0 files merged, 0 files removed, 0 files unresolved 
[email protected] ~/app-hg: hg branches 
default      1148:6d04af619607 

Il semble que les branches ont été « perdus » (en termes d'entre eux ne sont plus séparés) et en effet fusionné dans le conseil:

[email protected] ~/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 <[email protected]> 
date:  Fri Nov 13 10:35:51 2009 +0000 
summary:  Example 

étant donné que étant le cas:

a) Est-ce que je fais quelque chose de mal pour importer les branches ici? B) Les branches peuvent-elles être réellement importées?

Répondre

21

Ceci est voulu. Les branches Git importées sont seulement étiquetées dans Mercurial, et hg heads devrait vous donner le nombre correct de «branches» importées.

Comme mentionné dans this thread:

Tenir compte d'un arbre qui ressemble à ceci:

 o-o-o-o-o-o-b <- branch foo 
    /
-o-o-a 
     \ 
     o-o-c <- branch bar 

Quelle branche sont "a" et ses ancêtres sur?
Nous n'avons pas la moindre idée. En fait, les seuls changements dont nous avons la certitude sont b nd c parce que les noms de branches ne font pas partie de l'histoire.

Alors:

avère que c'est en fait impossible de faire de ce droit, parce que git ne stocke pas assez d'informations.
Considérons un dépôt avec deux branches dans git, chacune avec un nombre de commits.
Étant donné que git n'enregistre pas la branche sur laquelle chaque commit a pris naissance, il n'y a pas suffisamment d'informations dans l'arbre pour marquer chaque changeset.
Un utilisateur git peut échanger les noms des deux branches et rien n'est enregistré pour dire qu'il était toujours différent. Si deux branches ont un ancêtre commun (et elles le feront presque certainement), quelle branche est cet ancêtre? Nous ne savons pas. Le meilleur que nous pouvons faire dans le cas général est d'étiqueter chaque tête de branche comme étant sur cette branche. Ensuite, si vous faites une conversion incrémentielle, nous ferons probablement la bonne chose. Mais le concept de branches de git ne correspond pas parfaitement à celui de hg, donc cette conversion ne sera pas parfaite non plus.


Vous pouvez le tester avec un petit repo 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" 

Faire un tas de modifications dans trois branches distinctes:

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" 

clone alors que repo Git (juste au cas où, à des tests masculins autres)

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

Configurer votre ~/.hgrc avec un format UTF-8 sans nomenclature(m'a pris un certain temps pour le faire correctement!)

[extensions] 
hgext.convert = 

ensuite effectuer la conversion

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 

Vous obtiendrez les trois attendus "branches"

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 
+1

* Nice réponse *. – quark

+6

Le terme «branche» est trop surchargé en termes DVCS. Ce serait formidable si nous avions un langage convenu pour distinguer facilement les différentes significations (par exemple, les fourches de graphes, les têtes étiquetées, les révisions étiquetées). – quark

Questions connexes