Кадр из фильма «Красный шар». Режиссер Альбер Ламорис. 1956 год
Так уж случилось, что у меня остался ряд репозиториев на Mercurial, которые захостил на Bitbucket много лет назад. Проекты перешли в полуархивное состояние, поэтому заглядывал в них не так уж и часто. И тут я решил обратиться к материалам, надо было внести правку. С удивлением обнаружил, что репозиториев на битбакете нет, но есть публикация
«Sunsetting Mercurial support in Bitbucket».
Не критично, локальные репозитории сохранились же (а там коммитов за 10+ лет). Попробуем переехать по инструкции и статьи на github/gitlub. И, конечно же, эти инструкции работают только с latin-1, русские буквы либо не дают переехать, либо заменяются на
Является продолжением серии предыдущих публикаций.
Философские размышления о действиях Atlassian, огорчения о проигрыше mercurial, глубокое погружение в сравнительную архитектуру и т.д. не особо уместы. Требуется простое работающее пошаговое решение как сохранить репозиторий в git с минимальными потерями. Основой для выбранного мной решения послужили комментарии к публикации «Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице», только их также пришлось прогонять через фуганок и нащупывать магическую последовательность.
Если же говорить о работе с существующим репозиторием Mercurial, то есть несколько опций на усмотрение.
Найти подходящий sel-hosted mercurial server, развернуть у себя в сети и продолжить работать с ним. Таких немало, например, Mercurial Server, RhodeCode, HgLab и т.д.
Если вы выбрали по каким-то соображениям mercurial и принципиально хотите оставаться на нем — есть вариант.
Оперативно мигрировать на облачный Mercurail сервер, подумать о стратегии дальнейших действий, потестировать различные способы. Например, HelixTeamHub является неплохим бесплатным вариантом для этой стратегии.
Наплевать на кириллицу и мигрировать а GitHub залитый в HelixTeamHub репозиторий штатными средствами Github. Для англоязычных репозиториев решение GitHub Importer фактически является «one-click» ответом. При таком способе все киррилические имена файлов и комментарии превращаются в знаки вопроса.
Руками отконвертировать у себя на машине и залить на github. Ни одной рабочей последовательность мне найти в интернете не удалось, поэтому собирал лего самостоятельно. Нет цели сделать идеально красиво, надо просто перетащить репозиторий минимальными усилиями. Пошаговая инструкция следующая.
Целевая стратегия: конвертируем копию локального HG репозиторий и импортируем в
❒ Текст скрипта
Настройки TortoiseHG
Предыдущая публикация — «Разработка (dev) и data science в enterprise — битва за ресурсы или эффективное сотрудничество?».
Так уж случилось, что у меня остался ряд репозиториев на Mercurial, которые захостил на Bitbucket много лет назад. Проекты перешли в полуархивное состояние, поэтому заглядывал в них не так уж и часто. И тут я решил обратиться к материалам, надо было внести правку. С удивлением обнаружил, что репозиториев на битбакете нет, но есть публикация
«Sunsetting Mercurial support in Bitbucket».
Не критично, локальные репозитории сохранились же (а там коммитов за 10+ лет). Попробуем переехать по инструкции и статьи на github/gitlub. И, конечно же, эти инструкции работают только с latin-1, русские буквы либо не дают переехать, либо заменяются на
?
. Извечная проблема кодировок. Можно ли что-то сделать? Является продолжением серии предыдущих публикаций.
▍ Предпосылки
Философские размышления о действиях Atlassian, огорчения о проигрыше mercurial, глубокое погружение в сравнительную архитектуру и т.д. не особо уместы. Требуется простое работающее пошаговое решение как сохранить репозиторий в git с минимальными потерями. Основой для выбранного мной решения послужили комментарии к публикации «Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице», только их также пришлось прогонять через фуганок и нащупывать магическую последовательность.
Если же говорить о работе с существующим репозиторием Mercurial, то есть несколько опций на усмотрение.
▍ Опция 1
Найти подходящий sel-hosted mercurial server, развернуть у себя в сети и продолжить работать с ним. Таких немало, например, Mercurial Server, RhodeCode, HgLab и т.д.
Если вы выбрали по каким-то соображениям mercurial и принципиально хотите оставаться на нем — есть вариант.
▍ Опция 2
Оперативно мигрировать на облачный Mercurail сервер, подумать о стратегии дальнейших действий, потестировать различные способы. Например, HelixTeamHub является неплохим бесплатным вариантом для этой стратегии.
▍ Опция 3
Наплевать на кириллицу и мигрировать а GitHub залитый в HelixTeamHub репозиторий штатными средствами Github. Для англоязычных репозиториев решение GitHub Importer фактически является «one-click» ответом. При таком способе все киррилические имена файлов и комментарии превращаются в знаки вопроса.
▍ Опция 4
Руками отконвертировать у себя на машине и залить на github. Ни одной рабочей последовательность мне найти в интернете не удалось, поэтому собирал лего самостоятельно. Нет цели сделать идеально красиво, надо просто перетащить репозиторий минимальными усилиями. Пошаговая инструкция следующая.
Целевая стратегия: конвертируем копию локального HG репозиторий и импортируем в
https://github.com/<user>/bb-import/
- Ставим именно TortoseHG 5.0.2. Включаем в контекстном меню плагины
hg-git
иconvert
. - Копируем спасаемый Mercurial репозиторий в рабочую папку
c:/temp/hg-repo
. - Прогоняем в ней ниже приведенный питоновский 2.x скрипт для подготовки матчинга имен файлов в разных кодировках.
hg manifest --all | C:...\python.exe rename.py > rename.txt
- Создаем локально bare репозиторий git (в какой-нибудь папке, напримерв в
c:\temp
)
git init --bare c:\temp\bare_repo
- В директории с Mercurail репозиторием навешиваем бранч
hg
на репозиторий и делаем коммит в bare git репозиторий
hg bookmarks hg
hg push c:\temp\bare_repo
- Делаем обычный клон 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
- Создаем чистый репозиторий в GitHub
- Переносим remote в локальном репозитории на github:
git remote set-url origin https://github.com/<user>/bb-import.git
- Загоняем все ветки в облако
git push -u --all
- Переименуем в облаке бранч hg в master, пользуемся подсказками github для перенастройки локального репозитория тоже:
<code><span class="hljs-string">git </span><span class="hljs-string">branch </span>-m <span class="hljs-string">hg </span><span class="hljs-string">master </span><span class="hljs-string">git </span><span class="hljs-string">fetch </span><span class="hljs-string">origin </span><span class="hljs-string">git </span><span class="hljs-string">branch </span>-u <span class="hljs-string">origin/</span><span class="hljs-string">master </span><span class="hljs-string">master </span><span class="hljs-string">git </span><span class="hljs-string">remote </span><span class="hljs-built_in">set-head</span> <span class="hljs-string">origin </span>-a </code>
- ВСЁ, победа! Файлы на русском языке, комментарии тоже.
❒ Текст скрипта
rename.py
<code><span class="hljs-meta">#!/usr/bin/python</span> <span class="hljs-meta"># -*- coding: cp1251 -*-</span> <span class="hljs-keyword">import</span> sys <span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> sys.stdin:<span class="hljs-type"></span> old = path[:<span class="hljs-type">-1</span>] <span class="hljs-meta"># strip newline</span> <span class="hljs-keyword">new</span> <span class="hljs-type"></span>= old.decode(<span class="hljs-string">"cp1251"</span>).encode(<span class="hljs-string">"utf-8"</span>) print <span class="hljs-string">'rename "%s" "%s"'</span> % (old, <span class="hljs-keyword">new</span><span class="hljs-type"></span>) </code>
Настройки TortoiseHG
Предыдущая публикация — «Разработка (dev) и data science в enterprise — битва за ресурсы или эффективное сотрудничество?».