Как мне преобразовать набор ртутных репозиториев в git-репозиторий?

Что я имею

В настоящее время у меня есть набор ртутных репозиториев, которые содержат исходный код. Они используют схему "раздвоенного хранилища" для филиалов. Итак, функция "ветка" может выглядеть так:

master repo           A→B→C
                    ———————↘—————
cool_feature repo           D→E→F

однажды cool_feature готовы к прайм-тайм, мы hg pull это в мастер, так что это будет выглядеть так:

master A→B→C→D→E→F

В таком случае, cool_feature будет иметь такие же вещи, как master и это может быть отброшено.

Хотя D→E→F находятся в отдельном репозитории в некоторые моменты времени, они всегда находятся в ветке "по умолчанию" в Mercurial. Мы не используем именованные ветви для управления этими данными.

Это хорошо работает в Mercurial, но мы планируем перейти к Git, а Git делает вещи немного по-другому. Конечно, вы все еще можете разветвлять репозитории в git, но ветки git эфемерны и поэтому могут использоваться для коротких веток.

Что я хочу

Я хотел бы преобразовать это в один репозиторий git, который использует ветки для управления работой, еще находящейся в инвентаре. С точки зрения процесса, мы будем использовать в основном "git flow". Запросы на извлечение будут между ветвями, и после завершения работы ветви будут удалены.

master branch           A→B→C
                     ————————↘—————
cool_feature branch           D→E→F

Что я пробовал

Я не могу просто использовать HG's convert, потому что он не понимает несколько хранилищ. Фактически, каждый инструмент во всей экосистеме hg-git, похоже, хочет преобразовать ветви git в ветви hg и наоборот. (Несмотря на доказательства, свидетельствующие о том, что различные сообщества на практике используют их по-разному.)

Одна идея состоит в том, чтобы собрать их в единый репозиторий, преобразовать его, а затем позволить git разобраться с этим. В конце концов, git нужно только пометить головы. Проблема с этой идеей в том, что большинство инструментов отказываются конвертировать многоголовый репозиторий, и если они это делают, git спокойно отбрасывает непомеченные головы, как обычно. Если возможно пометить их после, я не понял это.

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

master repo            A→B→C→F→G→H
                     ———————↘—————↘————————
nifty_feature repo           D→E   I→J
                                \    ↓
                                 +——→K→L→M (K is a merge of E and J)

Такая ситуация обычно возникает, когда два разработчика начинают совместную работу над проектом, но не получают точно такой же набор изменений, что и их начальная точка. Но нет единой точки для выбора в качестве "линии вверх", из которой нужно создать ветку.

Еще одна сложная ситуация, когда первая ревизия представляет собой слияние:

master repo          A→B———→C
                        \    \
                         +→D  \
                    ————————\——↘—————————
gnarly_feature repo          +—→E→F

Здесь "корень" ветви E, слияние между C а также D, Мне не сразу понятно, как вы перенесете это на новую ветку, учитывая, что это ревизия слияния.

По другим причинам, я уже запускаю конвертацию через reposurgeon, поэтому у меня есть доступ к некоторым довольно причудливым инструментам для его изменения в полете. Но каждое преобразование занимает ~20 часов, поэтому пробовать кучу вещей, которые не удавались, оказалось очень дорого.

Но кажется, что, поскольку люди действительно конвертируют из hg в git, и каждая из них является широко используемой схемой ветвления, кто-то наверняка решил эту проблему. Любые идеи о том, какие инструменты использовать или какие стратегии попробовать, приветствуются. Как это сделать?

1 ответ

они всегда находятся в ветке "по умолчанию" в Mercurial. Мы не используем именованные ветви для управления этими данными

Это большая ошибка: вы можете использовать именованную ветку + отдельный клон одновременно

Я хотел бы преобразовать это в один репозиторий git, который использует ветки для управления работой, еще находящейся в инвентаре.

Это может быть большая ошибка 2 (в направлении / от Hg до Git/ и методологии / одного репо /)

Кажется, что каждый инструмент во всей экосистеме hg-git хочет конвертировать ветви git в ветви hg и наоборот.

Просто неправильно. У меня в руках Git-репо, клонированный с hg-git с набором Git-веток. На стороне Mercurial у меня есть (как и ожидалось) одна ветка

>hg branches
default                     5266:1ffe854c93c1

и Git-ветки, представленные в виде hg-закладок (которые они на самом деле)

>hg book
   1.6                       2344:fc32e948fcba
   1.7                       5140:1c58e9bfa3d5
   2.0                       5219:683d072d02b6
   feature_dbpluginapi       4986:a855a635e17f
   feature_indexCleanup      5207:7ec7ee38ef2f
   feature_preview           4806:d40ade50b113
   feature_updateAll         4807:97ea12fea917
   master                    4620:de0053588acf

Я не могу просто использовать конвертирование hg, потому что он не понимает несколько репозиториев

Но вы должны использовать его для преобразования каждого репозитория:

  • Конвертируйте каждый объект-репо в промежуточный репозиторий Mercurial, используя --branchmap опция (переименовать default переходить в другое... имя-функции?)
  • Вытащить преобразованный репо в мастер-репо; Вы должны получить полную историю, идентичную старой, с одним исключением: все разработки функций будут появляться в уникальных именованных ветвях.
  • Нажмите объединенное репо в Git с помощью hg-git или моста Git-Hg
Другие вопросы по тегам