Как мне преобразовать набор ртутных репозиториев в 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