Предыстория
Ещё летом в официальном блоге 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. К счастью, это можно сделать один раз и использовать один файл для всех остальных репозиториев.
В результате удалось основную ветку 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)
Автор: igolets