Как я могу преобразовать 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 со всеми "ветками"

Git репо

От POV Mercurial результаты импорта сильно отличаются: у репозитория есть одна реальная ветвь (названная ветвь default) и 3 анонимных ветки в нем, помеченные ртутными закладками br1-br2-br3.

HG-репо

Вы должны создать именованные ветви и переписать историю вручную, если вы хотите использовать именованные ветви Mercurial в этом хранилище:

  • зафиксировать новые пустые наборы изменений как потомки 0, они будут отправной точкой ветвей
  • перебазировать анонимные ветки этим новым родителям (изменить фактические ветки)

Ребазированный HG-репо

В качестве необязательного и последнего шага можно удалить созданные на шаге 1 пустые наборы изменений (histedit делай это хорошо) и все бесполезные закладки

Чистый HG-репо

Другие вопросы по тегам