Подтвердить что ты не робот

Как ветки git импортируются в mercurial с hg convert?

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

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

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

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

[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

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

a) Я делаю что-то неправильно для импорта ветвей здесь?

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

4b9b3361

Ответ 1

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

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

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

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

Какая ветвь "а" и ее предки на? У нас нет ни малейшего понятия. На самом деле, единственные изменения, которые мы имеем с уверенностью, - это b nd 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 repo (на всякий случай, для других тестов)

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