Использование "трансплантации hg" для сращивания содержимого другого хранилища на более позднем этапе

Если вы хотите перейти к актуальному вопросу, прокрутите до конца вопроса. Я просто счел необходимым объяснить обстоятельства.

Состояние дел

В нашей компании по историческим причинам у нас есть несколько систем контроля версий. В настоящее время мы пытаемся перейти на любой git-fast-import - действительно, совместимая распределенная система контроля версий, но в настоящее время наш выбор - Mercurial. Я говорю сейчас, потому что, как только вы сделали этот шаг, в большинстве случаев легче перейти с одной DVCS на другую.

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

Итак, мы имеем:

  1. древний репозиторий CVS
  2. один огромный (26 ГиБ) SVN-репозиторий с почти 7000 ревизиями, содержащий большое количество кода, некоторый экспериментальный код и фактический мусор (подлежащий фильтрации во время преобразования) и продукты сборки из различных выпусков - которые предназначены для выделения в репозиторий или даже просто структура папок своих)
  3. один SVN-репозиторий, содержащий связанный код, но не разделяющий файлы с двумя другими (представьте, что он вставлен как папка)

Огромный репо (2.) содержит снимки состояния репозитория CVS (1.) в разные моменты времени. Очевидно, что никто не был помечен в репозитории CVS, потому что это было бы потенциально полезно. Вдобавок к этому снимки имеют патчи, примененные поверх этого состояния снимка.

Это означает, что иерархия подпапок в 2. примерно соответствует 1.. Тем не менее, нет необходимости беспокоиться об этом, поскольку идея состоит в том, чтобы удалить одну из этих папок после первоначального объединения их под разными путями. Так что никаких именных столкновений здесь ожидать не стоит.

Что я сделал до сих пор

  • После некоторых исследований я выбрал reposurgeon как мой инструмент выбора. Это очень мощный инструмент, позволяющий, действительно, хирургические операции на git-fast-import потоки. Я настоятельно рекомендую его всем, кто занимается аналогичными миграциями.
  • Конверсия огромного хранилища полностью покрыта. Файлы и папки были удалены, а старые символы удалены. Изломы были сглажены, и такие вещи, как закрытие ветви (в SVN) и последующее повторное открытие ее из другой ревизии под тем же именем, были исправлены так, что они кажутся непрерывными. В основном все хирургические операции были сделаны. (результат составляет ~350 МБ как git-fast-import поток, кстати)
  • Меньшее хранилище SVN также в основном покрыто, хотя некоторые незначительные задачи остаются. Тем не менее, благодаря моему опыту от огромного репозитория SVN, я уверен, что это всего лишь несколько часов.
  • Последнее, но не в последнюю очередь хранилище CVS. Я пробовал ряд различных инструментов, в том числе cvs-fast-export, в настоящее время поддерживается Эрик С. Рэймонд, также автор reposurgeon, Я также подумал о преобразовании в SVN, просто чтобы найти, что набор инструментов (cvs2svn) раньше это делалось и для экспорта в Mercurial.

Эта проблема

В то время как преобразование SVN заняло много времени, чтобы добраться до точки, где мы можем назвать это выполненным, преобразование CVS все еще продолжается.

Поскольку CVS не имеет истории ревизий в репозитории, все инструменты должны пытаться проанализировать файлы RCS и разобраться в их содержимом, чтобы собрать головоломку.

Некоторые из действительно плохих шрамов я смог удалить вручную, буквально отредактировав заблокированный файл RCS в редакторе (после создания резервных копий). Таким образом, некоторые недействительные ревизии (RCS и CVS имеют другое представление о том, что является действительным номером ревизии), а также символы, которые отображались в виде тегов в некоторых файлах и как ветви в других, были исключены.

Я также могу предварительно обработать (CVS) репозиторий, чтобы удалить много веток и тегов, которые нам не нужны, до ветвей, которые нас интересуют (rcsfile.py от rcsgrep помог). В основном до этого определенного момента, мы хотим только содержание MAIN / trunk / default / master, как бы вы ни хотели это назвать.

Тем не менее, некоторые инструменты не работают (например, cvs-fast-export аварии) и другие дают результаты, которые несколько искажены.

Не так уж и плохо, с помощью reposurgeon, Однако полдюжины веток даже не попадают в конвертированное хранилище.

Причина, по-видимому, заключается в том, что во всех случаях все инструменты путаются из-за особой особенности, которую вы не найдете, например, в SVN.

Если теги ветвления принудительно перемещаются (cvs tag -B), тогда первоначально выделенный номер ветви в файле RCS будет потерян, и его место займет другой новый номер ветви. Однако старые версии остаются в файле.

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

Хотя было бы неплохо также включить осиротевшие ветви и залечить эти "раны", это не является приоритетом. Большинство файлов обрабатываются с cvs tag -B не исходные файлы, но такие файлы, как GNUmakefile или другие файлы проекта.

Однако проблема остается в том, что преобразование CVS не завершено и займет еще некоторое время.

И менеджеры теряют терпение...

Вопрос

Можно ли начать с двух SVN-репозиториев, встроенных в один Hg-репозиторий, а затем (когда преобразование CVS будет завершено) объединить эти изменения без инициализации еще одного не связанного репозитория Hg?

Я должен сказать, что сплайсинг (репо CVS) не приведет к конфликту путей. Другой репозиторий предназначен для встраивания через его собственный подкаталог, поэтому имена не конфликтуют.

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

Таким образом, я мог бы разделить миграцию на этапы.

  1. объединить два репозитория SVN в один репозиторий Hg - в основном сейчас
  2. сращивание в конвертированном (в Hg) репо CVS через несколько недель / месяцев

Это технически возможно с помощью hg transplant (или любой другой hg расширения в этом отношении)?

Если это так, я буду признателен за любые советы о потенциальных оговорках.

0 ответов

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