Как ветки git импортируются в mercurial с помощью hg convert?
У меня есть несколько веток в 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
Учитывая это в таком случае:
а) Я делаю что-то не так, чтобы импортировать здесь ветки?
б) Можно ли импортировать ветки?
1 ответ
Это по замыслу. Импортированные ветки 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