2014-10-16 3 views
3

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

Я уже прочитал How are git branches imported into mercurial with hg convert? и знаю, что невозможно узнать, какая фиксация принадлежит какой ветке в Git. Однако репозиторий с таким количеством головок, как ветки, для меня не является приемлемым решением.

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

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

ответ

2

Вы обязательно знать некоторые вещи о Git:

  • Гит «ветви» не являются филиалами для любых других хороших VCS, для Mercurial, Fе они закладками по своей природе («филиал» знак только head-changeset и любой более старый набор изменений не содержат эти метаданные)
  • Когда Гит-мальчик говорит о ветвях - он лжет, потому что ветви являются ветвями только в его Git-мире
  • Noboby (сегодня) преобразует Git- «ветки» в ветви при конвертировании репо sitories
  • В большинстве случаев (за исключение очень экзотического Гит-РЕПО) hg-git вместо Преобразовать Extension будет производить более правильно (двунаправленное) преобразование

Специально для вас я повторил операцию из (отлично общих) VonC answer в связанных Вами вопрос и покажет вам некоторые фотографии (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 

перед импортом М ercurial, со всеми «ветвями»

Git-repo

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

HG-repo

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

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

Rebased HG-repo

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

Clean HG-repo

+0

Спасибо большое, большое объяснение! История переписывания была той частью, которую я отсутствовал по другому вопросу. – Chris

+0

@Chris - BTW, вы можете (теоретически) автоматизировать ** все ** части изменений истории, кроме интерактивных по дизайну histedit –

Смежные вопросы