Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице | ДОСТУПНЫЙ ОТДЫХ
Интересное

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

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

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

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

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

    Собственно, на этом месте началась…

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

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

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

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

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

    Решение
    Базовая процедура

  • Забрать себе репозиторий git@github.com:seewindcn/tortoisehg.git — в нём есть плагин fixutf8, которого нет в основной поставке. Далее предполагается, что локальная копия будет находиться в каталоге D:Developmenttortoisehg
  • Сделать копию своего репозитория Mercurial, чтобы не повредить основное местоположение. Далее все команды выполняются в каталоге копии.
  • Выполнить исправление имен файлов и каталогов командой D:Developmenttortoisehghg.exe addremove -s 100
  • Сделать коммит в репозиторий D:Developmenttortoisehghg.exe commit -m «Fix filenames»
  • Включаем плагин hggit — в фале .hghgrc нужно добавить
    [extensions]
    hggit =
  • Готовимся к преобразованию в GIT — создаем метку master командой D:Developmenttortoisehghg.exe bookmark -r default master
  • Создаем GIT репозиторий в BitBucket
  • Делаем коммит в репозиторий hg push git+ssh://git@bitbucket.org:<user>/<reponame>.git (внимание, тут используется штатный hg, потому что клон от seewindcn не хочет работать по SSH)
  • Проверяем на сайте BitBucket, убеждаемся, что имена файлов кириллические не сломались
  • Клонируем GIT репозиторий к себе, проверяем имена файлов, выполняем побайтовое сравнение всех файлов, сборку проекта, тесты
  • После сборки наверняка появится масса новых файлов, которые GIT предложит закоммитить. Файл .hgignore придётся руками сконвертировать в .gitignore. К счастью, это можно сделать один раз и использовать один файл для всех остальных репозиториев.
  • Читать  Как птицы выглядят в детстве, или 42 птенца известных (и не очень) птиц

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

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

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

  • Получить список веток hg branches
  • Для каждой ветки
  • Переключиться на ветку hg up <branchname>
  • Cоздать метку (имя метки не должно совпадать с именем ветки): hg bookmark -r <hgbranchname> <gitbranchname>
  • Залить ветку в GIT hg push git@bitbucket.org:<user>/<reponame>.git
  • Может случиться так, что имя ветки тоже будет содержать кириллицу, в этом случае hg branches покажет кракозябры. В этом случае я использовал визуальный hg workbench — переключался на ветку и создавал метку там.

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

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

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

    • github.com/seewindcn/tortoisehg (сработало)
    • www.mercurial-scm.org/wiki/FixUtf8Extension (часть предыдущего решения)
    • www.mercurial-scm.org/wiki/ConvertExtension#Converting_from_Mercurial (не помогло)
    • serverfault.com/questions/319070/mercurial-convert-filename-encoding (использует расширение convert, не помогло)
    • bitbucket.org/rominf/hg_convert_filenames_encoding/src/default (автоматизация предыдущего варианта)
    • stackoverflow.com/questions/16037787/convert-mercurial-project-to-git (описывает расширение выгрузки в GIT)

    Источник

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

    I heart FeedBurner