Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице

?v=1

Предыстория


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

Прекращение поддержки Mercurial будет проходить в два этапа:

  1. С 1 февраля 2020 года пользователи больше не смогут создавать новые репозитории.
  2. С 1 июня 2020 года пользователи не смогут использовать функции Mercurial в Bitbucket или через его API, а все репозитории Mercurial будут удалены.

С причинами такого решения всё более-менее понятно, но я в работе использую несколько репозиториев на Mercurial (Mercurial мне всегда больше нравился, но этот вопрос я оставлю за рамками данной статьи), которые потребовалось сконвертировать в GIT.
Собственно, на этом месте началась…

Проблема


Разработчики и служба поддержки BitBucket предложили несколько вариантов такой конвертации, я их всех перепробовал, а заодно попробовал сторонние инструменты, наподобие импорта репозиториев в GitHub.

Выяснилось, что все эти инструменты портят имена файлов и каталогов, которые содержат символы в кириллице, а у меня полно таких файлов (ТЗ, спецификации и прочие подобные файлы). Забавно, что комментарии к коммитам, содержащие кириллицу, прекрасно переносятся и отображаются после переноса.

В просторах интернета находил информацию о том, что в Mercurial есть инструменты (ключи в конфиг-файле репозитория), которые позволяют управлять кодировкой символов по умолчанию, но во-первых, они включаются только явно, а во-вторых, нет инструмента преобразования существующего репозитория. Ну и я не проверял, насколько эта опция помогает с миграцией при помощи готовых инструментов — мне уже поздновато этим путём идти.

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

Возможно, кому-то перенос репозитория с русскими символами в именах файлы тоже актуален и моя статья сэкономит немного времени.

Решение


Базовая процедура


  1. Забрать себе репозиторий git@github.com: seewindcn/tortoisehg.git — в нём есть плагин fixutf8, которого нет в основной поставке. Далее предполагается, что локальная копия будет находиться в каталоге D:\Development\tortoisehg
  2. Сделать копию своего репозитория Mercurial, чтобы не повредить основное местоположение. Далее все команды выполняются в каталоге копии.
  3. Выполнить исправление имен файлов и каталогов командой D:\Development\tortoisehg\hg.exe addremove -s 100
  4. Сделать коммит в репозиторий D:\Development\tortoisehg\hg.exe commit -m «Fix filenames»
  5. Включаем плагин hggit — в фале .hg\hgrc нужно добавить
    [extensions]
    hggit =
  6. Готовимся к преобразованию в GIT — создаем метку master командой D:\Development\tortoisehg\hg.exe bookmark -r default master
  7. Создаем GIT репозиторий в BitBucket
  8. Делаем коммит в репозиторий hg push git+ssh://git@bitbucket.org: /.git (внимание, тут используется штатный hg, потому что клон от seewindcn не хочет работать по SSH)
  9. Проверяем на сайте BitBucket, убеждаемся, что имена файлов кириллические не сломались
  10. Клонируем GIT репозиторий к себе, проверяем имена файлов, выполняем побайтовое сравнение всех файлов, сборку проекта, тесты
  11. После сборки наверняка появится масса новых файлов, которые GIT предложит закоммитить. Файл .hgignore придётся руками сконвертировать в .gitignore. К счастью, это можно сделать один раз и использовать один файл для всех остальных репозиториев.

В результате удалось основную ветку default исходного репозитория Mercurial перенести со всей историей коммитов в master репозитория GIT и даже с метками. Из минусов отмечу только полное отсутствие информации об изменениях файлов с кириллицей в истории коммитов — коммиты есть, а от файлов с кириллицей нет даже упоминаний (остальные файлы, естественно, в полном порядке).

В целом, задачу можно было считать выполненной, но из спортивного интереса, мне также было интересно перенести остальные ветки.

Перенос веток, кроме default


  1. Получить список веток hg branches
  2. Для каждой ветки
    1. Переключиться на ветку hg up
    2. Cоздать метку (имя метки не должно совпадать с именем ветки): hg bookmark -r
    3. Залить ветку в GIT hg push git@bitbucket.org: /.git

Может случиться так, что имя ветки тоже будет содержать кириллицу, в этом случае hg branches покажет кракозябры. В этом случае я использовал визуальный hg workbench — переключался на ветку и создавал метку там.

На этом месте наступает полный феншуй.

На случай, если кому-то будет интересно покопать поглубже, то оставляю…

Список использованной литературы


© Habrahabr.ru