2009-11-16 3 views
17

Ich habe eine Reihe von Niederlassungen in einem Git-Repository:Wie werden Git Zweige importiert in Quecksilber mit HG konvertieren?

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

Wenn ich diesen git Repo in Mercurial versuchen und importieren:

[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 

Es scheint, dass die Zweige "verloren" wurden (in Begriffe von ihnen nicht mehr getrennt werden) und in der Tat in die Spitze verschmolzen:

[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 

Da der Fall:

a) Mache ich etwas falsch, um die Filialen hier zu importieren?

b) Können die Zweige tatsächlich importiert werden?

Antwort

21

Dies ist von Entwurf. Importierte Git-Zweige werden nur in Mercurial gekennzeichnet, und hg heads sollte Ihnen die korrekte Anzahl importierter "Zweige" geben.

Wie in this thread erwähnt:

einen Baum Betrachten Sie die wie folgt aussieht: auf

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

Welche Niederlassung sind "a" und seine Vorfahren?
Wir haben nicht die geringste Ahnung. Tatsächlich sind die einzigen Änderungssätze, über die wir Gewissheit haben, b und c, weil Zweignamen nicht Teil der Geschichte sind.

So:

Stellt sich heraus, es ist eigentlich unmöglich, dieses Recht zu tun, weil git nicht genügend Informationen speichert.
Betrachten Sie ein Repo mit zwei Zweigen in Git, jedes mit einer Anzahl von Commits.
Da git nicht aufzeichnet, aus welchem ​​Zweig die einzelnen Commits stammen, sind nicht genügend Informationen in der Baumstruktur vorhanden, um die einzelnen Changesets zu kennzeichnen.
Ein Git Benutzer kann die Namen der beiden Zweige tauschen und nichts wird aufgezeichnet, um zu sagen, dass es jemals anders war. Wenn zwei Zweige einen gemeinsamen Vorfahren haben (und das werden sie mit ziemlicher Sicherheit tun), In welchem ​​Zweig ist dieser Vorgänger? Wir wissen es nicht.

Das beste, was wir im allgemeinen Fall tun können, ist, jeden Zweigkopf als auf diesem Zweig zu bezeichnen. Wenn Sie eine inkrementelle Konvertierung durchführen, werden wir wahrscheinlich das Richtige tun. Aber gits Konzept von Zweigen passt nicht perfekt zu hg, also wird diese Umwandlung auch nicht perfekt sein.


Sie können es testen mit einem kleinen Git Repo (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" 

Stellen eine Reihe von Änderungen in drei getrennten Zweigen:

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" 

Dann Klon, der Git repo (nur für den Fall, zu männlich anderen Tests)

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

Configure Ihre ~/.hgrc mit einer Format UTF-8 ohne BOM(dauerte eine Weile, um es richtig zu machen!)

[extensions] 
hgext.convert = 

Dann

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 

Sie lernen die drei erwarteten "Zweige"

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

* Nizza * Beantworten Sie die Konvertierung machen. – quark

+6

Der Begriff "Verzweigung" ist in DVCS-Begriffen zu stark überladen. Es wäre großartig, wenn wir eine vereinbarte Sprache hätten, um leicht zwischen den verschiedenen Bedeutungen unterscheiden zu können (z. B. Graph-Gabeln, beschriftete Köpfe, markierte Revisionen). – quark