Как я могу преобразовать Git-репозиторий с ветвями в работающий Mercurial-репозиторий?
Я хочу преобразовать Git-репозиторий с несколькими ветками в Mercurial. С помощью hg convert
создается только одна ветка по умолчанию, которая затем имеет заголовок для каждой ветки Git.
Я уже читал, как ветки git импортируются в Mercurial с помощью hg convert? и я знаю, что невозможно знать, какой коммит принадлежит какой ветке в Git. Тем не менее, хранилище с таким количеством головок и веток не является для меня подходящим решением.
Поскольку все ветви разные, я, очевидно, не могу объединить их все в одну головку.
Как я могу преобразовать или изменить преобразованный репозиторий таким образом, чтобы у меня все головы были в разных ветвях? Обратите внимание, что мне не обязательно иметь все существующие коммиты, назначенные на правильную ветвь, но я хочу, чтобы коммиты с этого момента были назначены на правильную ветвь и иметь только один заголовок на ветку.
1 ответ
Вы должны знать кое-что о Git:
- Git "ветки" не являются ветвями для любой другой хорошей VCS, для Mercurial, например, они являются закладками по своей природе ("ветка" помечает только head-changeset, а любая более старая ревизия не содержит этих метаданных)
- Когда Git-boy говорит о ветвях - он лжет, потому что ветви являются ветвями только в его Git-мире
- Noboby (сегодня) будет конвертировать Git-"ветки" в ветки при конвертации репозиториев.
- В большинстве случаев (кроме очень экзотических Git-репо)
hg-git
вместо этого Convert Extension произведет более правильное (двунаправленное) преобразование
Специально для вас я повторил операции от (отлично общего) ответа VonC на связанный с вами вопрос и покажу вам несколько картинок (Git от SmartGit, Mercurial от TortoiseHG)
После того, как все совершает,
GitRepo>git log --oneline
79ea101 third evolution in branch 2
720ac25 second evolution in branch 2
48951c3 first evolution in branch 2
6cf26b0 first content, to be evolved in three different branches
перед импортом в Mercurial со всеми "ветками"
От POV Mercurial результаты импорта сильно отличаются: у репозитория есть одна реальная ветвь (названная ветвь default
) и 3 анонимных ветки в нем, помеченные ртутными закладками br1-br2-br3.
Вы должны создать именованные ветви и переписать историю вручную, если вы хотите использовать именованные ветви Mercurial в этом хранилище:
- зафиксировать новые пустые наборы изменений как потомки 0, они будут отправной точкой ветвей
- перебазировать анонимные ветки этим новым родителям (изменить фактические ветки)
В качестве необязательного и последнего шага можно удалить созданные на шаге 1 пустые наборы изменений (histedit
делай это хорошо) и все бесполезные закладки