Перетащите в репозиторий Hg из репозитория Git, который является тем же проектом, но потерял историю

Мой сценарий таков.

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

Я хочу придерживаться Hg, и Hg-Git, очевидно, позволит мне извлечь из репозитория Git, но я не знаю, как это сделать, — это склеить голову репозитория Hg с хвостом репозитория Git, поэтому Я могу просто продолжать получать регулярные обновления, как и раньше. Фактическая фиксация в Git, которая соответствует заголовку репозитория Hg, не является первой фиксацией, поэтому это не кончик хвоста.

Я думал, что hg convert и --splicemap могут быть полезны, но чем больше я читал об этом, тем меньше это казалось мне решением.

Может ли кто-нибудь предложить какие-либо предложения относительно того, как я могу этого добиться?


Обновление
Просто для сведения всех, кто может пытаться сделать что-то подобное, мне наконец удалось добиться желаемого результата, но это был долгий и извилистый путь, и оказалось, что hg convert и splicemap были ответом в конце концов.

  1. Я вытащил репозиторий Git с Github с помощью плагина hg-git.
  2. Затем я клонировал это в новый репозиторий и вытащил связанное, но отключенное содержимое репозитория Hg с помощью hg pull --force.
    Итак, теперь у меня есть репозиторий с двумя отдельными ветвями разработки, которые не имеют общего предка, что касается репозитория, я буду называть его гидра.
  3. Используя hg convert и splicemap, я объединил ветки в совпадающей точке в истории в новое репо, а затем запустил hg strip, чтобы избавиться ненужных битов.
  4. Хитрость, однако, заключалась в том, что исходный репозиторий Git будет обновляться, и я хотел иметь возможность вносить новые изменения в объединенный репозиторий.
    Решение? Пакетные файлы.
    Да, вы не ослышались, пакетные файлы.
    По сути, решение заключалось в наборе из 3-х элементов: во-первых, вытащить из Github в репозиторий, который просто содержит репозиторий Git. Второй извлечен из репозитория Git в гидру (источник Hg не изменится, поэтому мне не нужно снова извлекать из него). Третий повторно запустил команду hg convert, чтобы она обновила присоединенный репозиторий новой информацией от гидры.

Это неприятно, это затянуто, и это был какой-то кошмар для настройки, но теперь он работает чисто, и мой окончательный репо имеет предсказуемый и разумный размер.


person Nanhydrin    schedule 26.06.2013    source источник


Ответы (1)


Никогда не пробовал это, но, возможно, манипулирование файлом git-map в /.hg мостового репо может сработать. Я бы попробовал так:

  1. Допустим, кончик репозитория Hg — это корень репозитория Git.
  2. Клонируйте репозиторий Git через hg-git только до корня (это возможно с Git, верно?).
  3. Перетащите все коммиты из исходного репозитория Hg в клон hg-git.
  4. Удалите единственный корень, но запишите полный хэш этого корня.
  5. Запишите полный хэш подсказки репозитория Hg (теперь также подсказка клона hg-git).
  6. Отредактируйте /.hg/git-mapfile. Он должен содержать только одну запись с хешем одинокого корня с одной стороны (должен быть справа). Замените этот хэш на тот, что в подсказке. Не заменяйте другую сторону (слева), так как это хэш соответствующего объекта коммита Git.
  7. "hg тянуть". Если теория верна, это добавит новые узлы Git к старым узлам Hg.

Может быть, это полная ерунда, но, по крайней мере, более старые («более тупые») версии hg-git просто определяли необходимые объекты git через этот файл карты. Так что стоило бы попробовать...

person Face    schedule 26.06.2013
comment
Похоже, что это может помочь, я попробую завтра и посмотрю, как оно пойдет. Спасибо! - person Nanhydrin; 27.06.2013
comment
Ну в принципе заработало. Я не мог понять, как вытащить только корень из Git, поэтому я вытащил много, но в любом случае это не было проблемой, используя полосу. Однако, когда я подключил все с помощью файла карты и снова вытащил из Git, размер репо на диске увеличился в 5 раз, хотя я вытащил только 200 ревизий, которые не учитывают увеличение размера. Клон был вдвое меньше, но все же в два раза больше, чем я ожидал. Ваш ответ абсолютно сработал, просто оказалось, что то, что я хотел сделать, на самом деле не является возможным решением. - person Nanhydrin; 01.07.2013