Как ветки git импортируются в mercurial с помощью hg convert? - PullRequest
17 голосов
/ 16 ноября 2009

У меня есть несколько веток в git-репозитории:

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

Если я попытаюсь импортировать это git-репо в 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

Кажется, что ветви были "потеряны" (с точки зрения того, что они больше не разделяются) и действительно слились в верхушку:

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

Учитывая это:

a) Я что-то не так делаю, чтобы импортировать здесь ветки?

б) Можно ли импортировать ветки?

1 Ответ

21 голосов
/ 17 ноября 2009

Это по замыслу. Импортированные ветки Git помечены только в Mercurial, и hg heads должно дать вам правильное количество импортированных «веток».

Как уже упоминалось в этой теме :

Рассмотрим дерево, которое выглядит так:

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

На какой ветви находится "а" и его предки?
У нас нет ни малейшего понятия. Фактически, единственные наборы изменений, в которых мы уверены, это bnd c, потому что имена ветвей не являются частью истории.

Итак:

Оказывается, на самом деле это невозможно сделать правильно, потому что git не хранит достаточно информации.
Рассмотрим репо с двумя ветками в git, каждая с количеством коммитов.
Поскольку git не записывает, с какой ветви произошел каждый коммит, в дереве недостаточно информации для маркировки каждого набора изменений.
Пользователь git может поменять имена двух веток, и ничего не записывается, чтобы сказать, что когда-либо было по-другому. Если две ветви имеют общего предка (а они почти наверняка будут), на какой ветке находится этот предок? Мы не знаем.

Лучшее, что мы можем сделать в общем случае, - это пометить каждую головку ветки как находящуюся в этой ветке. Тогда, если вы сделаете пошаговое преобразование, мы, вероятно, поступим правильно. Но концепция веток в git не идеально подходит для hg, поэтому это преобразование тоже не будет идеальным.


Вы можете протестировать его с небольшим 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"

Сделайте кучу модификаций в трех отдельных ветках:

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"

Затем клонируйте этот репозиторий Git (на всякий случай, на другие тесты мужского пола)

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

Сконфигурируйте ~/.hgrc в формате UTF-8 без спецификации (мне потребовалось некоторое время, чтобы сделать это правильно!)

[extensions]
hgext.convert = 

Затем сделайте преобразование

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

Вы получите три ожидаемых "ветки"

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