Один из способов hg для синхронизации
У меня есть ртутный репозиторий, содержащий монолитный проект, который я пытаюсь постепенно разделить. Делая это, я решил преобразовать новые подпроекты в git, следовательно, в одну сторону.
Еще несколько подробностей о том, что я делаю:
- репозиторий hg и новые репозитории git находятся в частной облачной учетной записи Bitbucket.
- Я хочу сохранить историю коммитов, делая раскол
- Все наши разработки основаны на Windows (хотя я открыт для перехода на систему на основе Unix)
- Начальному репо 7 лет, у него есть все виды тегов, закрытые ветви, некоторые ветви с неподдерживаемыми символами git. Но что еще более важно, я рад, что могу перенести только default / master (если это помогает мне выполнить работу и не означает потерю истории)
- Поскольку мы постепенно конвертируем некоторые проекты в репозитории (скажем, у меня 30 проектов, и я хочу постепенно перемещать их), мне нужно выполнить одностороннюю синхронизацию из hg в git. Я не боюсь слияний, и я рад оставить свою новую работу репо вне мастерской, а затем просто перепроверить изменения hg по мере продвижения.
- Я понял, что наше ртутное репо не сконфигурировано должным образом (я видел несколько голов и т. Д.), Но я нахожусь за пределами своей зоны комфорта, когда углубляюсь в ртутную магистраль.
До сих пор я пробовал несколько инструментов, таких как быстрый экспорт, плагин mercurial hg hggit. Однако я изо всех сил пытаюсь найти хорошие пошаговые инструменты. (и почти все подходы в этой теме - конвертировать проект Mercurial в Git)
fast-export был инструментом, который дал мне лучшие результаты, я смог перенести проект раз и все, но когда я попытался выполнить повторную синхронизацию, я начал получать ошибки, такие как изменение ветки снаружи и множественные заголовки.
Теперь, когда я объяснил свою проблему более подробно, я могу задать вопрос.
Каков наилучший подход и инструменты, которые я могу использовать, чтобы иметь возможность сделать односторонний переход к git-миграции?
Кроме того, как я могу убедиться, что мой Mercurial репозиторий правильно настроен, чтобы избежать возможных проблем при переходе на git?
1 ответ
После бесчисленных попыток, я думаю, я нашел способ сделать то, что я хотел, последовательно. Для дальнейшего использования это были шаги:
Установка необходимых инструментов
Установите Git для Windows
Установите Tortoise HG или Mercurial отдельно.
Установите Python 2.7 (быстрый экспорт не поддерживает Python 3.X на данный момент)
Откройте командную строку (Запуск от имени администратора).
Проверьте, можете ли вы запускать git, mercurial и python следующим образом:
$ git
$ mercurial
$ python
Если вы установили другие выше и вы получаете ошибки, вам нужно указать путь, в моем случае я должен был сделать это только для Python. Так я и сделал:
$ setx path "%path%;C:\Python27"
перезапустите командную строку, и все должно быть готово к работе.
Установите fast-export и клонируйте репозитории mercurial и git
Создайте чистый каталог, чтобы работа там содержалась (в моем случае я не буду использовать репозитории внутри этого каталога ни для чего, кроме синхронизации проектов). например:
c:\syncprojects
Изнутри c:\syncprojects
начать с клонирования быстрого экспорта
$ git clone https://github.com/frej/fast-export.git fast-export
Затем клонируйте ртутный проект
$ hg clone https://bitbucket.org/user/mercurialrepo
Затем клонируйте проект git, в который вы хотите синхронизировать
$ git clone https://bitbucket.org/user/gitrepo gitrepo
Это помогло мне правильно настроить файл авторов, поэтому я сделал
$ cd mercurialrepo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors
Затем откройте файл авторов, созданный в c:\syncprojects, убедитесь, что файл авторов соответствует чему-то похожему на это:
bob=Bob Jones <bob@company.com>
bob@localhost=Bob Jones <bob@company.com>
bob <bob@company.com>=Bob Jones <bob@company.com>
Следующий шаг - начать фактическую миграцию. На этом этапе мне было удобнее пользоваться git bash, поэтому я сделал следующее: В проводнике Windows щелкните правой кнопкой мыши папку gitrepo и выберите "Git Bash here".
Затем я сделал мой локальный репозиторий Git чувствительным к регистру, это помогает с процессом, но это хорошо, так как я столкнулся с проблемами с чувствительными к регистру папками в прошлом. Просто делать:
git config core.ignoreCase false
Запустить синхронизацию
Наконец я сделал:
$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force
Если все идет хорошо (и это не обязательно происходит постоянно, по нескольким причинам у меня были проблемы с головами в Mercurial, проблемы с локальными изменениями в git-репо, в которые я пытаюсь синхронизироваться).
Все, что нам нужно сделать, это проверить голову и отправить изменения на удаленный, как таковой:
$ git checkout HEAD
$ git push -u origin master
В следующий раз, когда вы захотите выполнить синхронизацию, просто повторите заключительную часть:
$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force
$ git checkout HEAD
$ git push -u origin master
К сожалению, шаги не такие быстрые, как кажется, но это был более лаконичный и последовательный способ решения моей проблемы.
Еще несколько советов:
- Я не слил новый код для освоения во вновь созданном git-репо.
- До тех пор, пока я не буду полностью удовлетворен и не смог остановить синхронизацию, у меня будет ветка, содержащая изменения, которые я делаю в своей повседневной работе, и периодически сливаю мастер обратно в эту ветку.
- Не используйте эти репозитории для разработки, быстрый экспорт хранит данные внутри репозиториев, которые могут быть потеряны, что сильно затрудняет реализацию проекта повторной синхронизации. Клонируйте репозитории в отдельном месте (и, пожалуйста, будьте осторожны с проверкой других веток в этих репозиториях по той же причине).