Как стать автором
Обновить
2728.8
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Уходим с Mercurial на Git

Время на прочтение3 мин
Количество просмотров9.9K
Кадр из фильма «Красный шар». Режиссер Альбер Ламорис. 1956 год

Так уж случилось, что у меня остался ряд репозиториев на Mercurial, которые захостил на Bitbucket много лет назад. Проекты перешли в полуархивное состояние, поэтому заглядывал в них не так уж и часто. И тут я решил обратиться к материалам, надо было внести правку. С удивлением обнаружил, что репозиториев на битбакете нет, но есть публикация «Sunsetting Mercurial support in Bitbucket».

Не критично, локальные репозитории сохранились же (а там коммитов за 10+ лет). Попробуем переехать на github/gitlab по инструкции из статьи. И, конечно же, эти инструкции работают только с latin-1, русские буквы либо не дают переехать, либо заменяются на ?. Извечная проблема кодировок. Можно ли что-то сделать?

UPDATE по результатам комментариев.
Для «приземления» задачи рассмотрите контекст коммерческой поддержки большой инсталляции ПО, созданного в компании где вы сейчас работаете, которое n лет уже не развивается (выпустили совсем новую ветку), но обязательства по поддержке остались по проданным ранее контрактам. И периодически всплывают баги.

Является продолжением серии предыдущих публикаций.

▍ Предпосылки


Философские размышления о действиях Atlassian, огорчения о проигрыше mercurial, глубокое погружение в сравнительную архитектуру и т.д. не особо уместны. Требуется простое работающее пошаговое решение как сохранить репозиторий в git с минимальными потерями. Основой для выбранного мной решения послужили комментарии к публикации «Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице», только их также пришлось прогонять через фуганок и нащупывать магическую последовательность.

Если же говорить о работе с существующим репозиторием Mercurial, то есть несколько опций на усмотрение.

▍ Опция 1


Найти подходящий self-hosted mercurial server, развернуть у себя в сети и продолжить работать с ним. Таких немало, например, Mercurial Server, RhodeCode, HgLab и т.д.
Если вы выбрали по каким-то соображениям mercurial и принципиально хотите оставаться на нем — есть вариант.

▍ Опция 2


Оперативно мигрировать на облачный Mercurial сервер, подумать о стратегии дальнейших действий, протестировать различные способы. Например, HelixTeamHub является неплохим бесплатным вариантом для этой стратегии.

▍ Опция 3


Наплевать на кириллицу и мигрировать в GitHub, предварительно залитый в HelixTeamHub репозиторий, штатными средствами Github. Для англоязычных репозиториев решение GitHub Importer фактически является «one-click» ответом. При таком способе все кириллические имена файлов и комментарии превращаются в знаки вопроса.

▍ Опция 4


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

Целевая стратегия: конвертируем копию локального HG репозиторий и импортируем в https://github.com/<user>/bb-import/

  1. Ставим именно TortoseHG 5.0.2. Включаем в контекстном меню плагины hg-git и convert.
  2. Копируем спасаемый Mercurial репозиторий в рабочую папку c:/temp/hg-repo.
  3. Прогоняем в ней ниже приведенный питоновский 2.x скрипт для подготовки матчинга имен файлов в разных кодировках.

    hg manifest --all | C:...\python.exe rename.py > rename.txt
  4. Создаем локально bare репозиторий git (в какой-нибудь папке, напримерв в c:\temp)
    git init --bare c:\temp\bare_repo
  5. В директории с Mercurail репозиторием навешиваем бранч hg на репозиторий и делаем коммит в bare git репозиторий
    hg bookmarks hg
    hg push c:\temp\bare_repo
  6. Делаем обычный клон non-bare репозитория, ключевой момент — вытягиваем бранч hg, чтобы не получить ошибку 'remote HEAD refers to nonexisting ref, unable to checkout'
    git clone -b hg git_bare_repo git_regular_repo, например, git clone -b hg c:\temp\bare_repo c:\temp\bb_import
  7. Создаем чистый репозиторий в GitHub
  8. Переносим remote в локальном репозитории на github:
    git remote set-url origin https://github.com/<user>/bb-import.git
  9. Загоняем все ветки в облако
    git push -u --all
  10. Переименуем в облаке бранч hg в master, пользуемся подсказками github для перенастройки локального репозитория тоже:

    git branch -m hg master
    git fetch origin
    git branch -u origin/master master
    git remote set-head origin -a
  11. ВСЁ, победа! Файлы на русском языке, комментарии тоже.

Текст скрипта rename.py

#!/usr/bin/python
# -*- coding: cp1251 -*-

import sys
for path in sys.stdin:
old = path[:-1] # strip newline
new = old.decode("cp1251").encode("utf-8")
print 'rename "%s" "%s"' % (old, new)



Настройки TortoiseHG

Предыдущая публикация — «Разработка (dev) и data science в enterprise — битва за ресурсы или эффективное сотрудничество?».

Теги:
Хабы:
Всего голосов 37: ↑36 и ↓1+35
Комментарии34

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds