Как я могу преобразовать репозиторий Git с ветвями в работоспособный репозиторий Mercurial?

Я хочу преобразовать репозиторий Git с несколькими ветвями в репозиторий Mercurial. При использовании hg convert создается только одна ветка по умолчанию, которая затем имеет заголовок для каждой ветки Git.

Я уже читал Как ветки git импортируются в mercurial с помощью hg convert? и я знаю, что невозможно узнать, какой коммит какой ветке принадлежит в Git. Однако репозиторий с таким количеством головок, как и веток, для меня не подходящее решение.

Поскольку все ветки разные, я, очевидно, не могу объединить их все в одну головку.

Как я могу преобразовать или изменить преобразованный репозиторий таким образом, чтобы каждая голова находилась в отдельной ветке? Обратите внимание, что мне не обязательно, чтобы все существующие коммиты были назначены правой ветке, но я хочу, чтобы с этого момента коммиты были назначены правой ветке и имели только одну головку на ветку.


person Chris    schedule 16.10.2014    source источник


Ответы (1)


Вы должны знать кое-что о Git:

  • «Ветви» Git не являются ветвями для какой-либо другой хорошей VCS, для Mercurial, например, они являются закладками по своей природе («ветвь» обозначает только набор изменений, а любой более старый набор изменений не содержит этих метаданных)
  • Когда 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-repo

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

HG-репо

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

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

Rebased HG-repo

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

Чистое репозиторий HG

person Lazy Badger    schedule 17.10.2014
comment
Большое спасибо, отличное объяснение! Переписывание истории было той частью, которую я упустил по другому вопросу. - person Chris; 17.10.2014
comment
@Chris - Кстати, вы можете (теоретически) автоматизировать все изменения истории, кроме интерактивного по дизайну histedit - person Lazy Badger; 17.10.2014