Конвертировать Mercurial проект в Git
Мне нужно преобразовать проект Mercurial в проект GIT, но я бы хотел сохранить историю изменений без изменений. Мое текущее решение состояло в том, чтобы просто удалить связанные с hg файлы, а затем git init && добавить вручную нужные мне файлы, но это не сохранило бы историю. Есть ли какие-либо решения для этого?
8 ответов
Вы можете попробовать использовать быстрый экспорт:
cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
Также взгляните на этот ТАК вопрос.
Хорошо, я наконец-то решил это. Это использует TortoiseHg на Windows. Если вы не используете это, вы можете сделать это в командной строке.
- Установить TortoiseHg
- Щелкните правой кнопкой мыши пустое место в проводнике и перейдите к настройкам TortoiseHg:
- включить
hggit
:
Откройте командную строку, введите пустой каталог.
git init --bare .git
(Если вы не используете репо, вы получите сообщение об ошибке типаabort: git remote error: refs/heads/master failed to update
cd
в ваш репозиторий Mercurial.hg bookmarks hg
hg push c:/path/to/your/git/repo
В каталоге Git:
git config --bool core.bare false
(Не спрашивайте меня, почему. Что-то о "рабочих деревьях". Git серьезно недружелюбен. Клянусь, написание реального кода проще, чем использование Git.)
Надеюсь, это сработает, и тогда вы сможете перейти от этого нового git-репо к не голому.
Если вы хотите импортировать существующий Mercurial репозиторий в репозиторий GitHub, теперь вы можете просто использовать GitHub Importer, доступный здесь [Требуется вход в систему]. Больше не нужно возиться с быстрым экспортом и т. Д. (Хотя это очень хороший инструмент)
Вы получите все ваши коммиты, ветки и теги в целости и сохранности. Еще одна интересная вещь - вы также можете изменить электронный адрес автора. Посмотрите на скриншоты ниже:
Некоторые заметки из моего опыта конвертации Mercurial в Git.
1. HG-быстрый экспорт
Использование hg-fast-export не удалось, и мне нужно --force, как указано выше. Далее я получил эту ошибку:
ошибка: невозможно заблокировать ref 'refs/heads/stable': существует 'refs/heads/stable/sub-branch-name'; не может создать 'refs / heads / stable'
После завершения hg-fast-export у меня было ампутированное репо. Я думаю, что в этом репо было несколько осиротевших веток и что hg-fast-export требует несколько идеализированного репо. Это все казалось немного грубым по краям, поэтому я перешел к Kiln Harmony ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/)
2. Печь
Kiln Harmony, по-видимому, не существует на бесплатной учетной записи уровня, как предложено выше. Я мог выбирать между репозиториями только для Git и Mercurial, и у меня нет возможности переключаться. Я поднял билет поддержки и поделюсь результатом, если они ответят.
3. HG-GIT
Ртутный плагин Hg-Git ( http://hg-git.github.io/) сработал для меня. К вашему сведению, на Mac OSX я установил hg-git через macports следующим образом:
- порт sudo установить python27
- выбор порта sudo --set python python27
- порт sudo установить py27-hggit
- vi ~ /.hgrc
.hgrc нужны эти строки:
[ui]
username = Name Surname <me@mydomain.com>
[extensions]
hgext.bookmarks =
hggit =
Я тогда имел успех с:
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
4. Предостережение: знайте свое репо
Все вышеперечисленное - тупые инструменты, и я только продвинулся вперед, потому что потребовалось достаточно времени, чтобы заставить команду правильно использовать git.
После первого нажатия на проект в соответствии с (3) я потерял все новые изменения. Это потому, что эту строку кода следует рассматривать только как руководство:
$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
Теория заключается в том, что ветка по умолчанию может считаться ведущей при нажатии на git, и в моем случае я унаследовал репо, где они использовали "stable" в качестве эквивалента master. Более того, я также обнаружил, что верхушка репо была исправлением, еще не объединенным со "стабильной" веткой.
Без правильного понимания как Mercurial, так и репо, который нужно конвертировать, вам лучше не делать конвертацию.
Я сделал следующее, чтобы подготовить репо ко второй попытке конвертации:
hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
После этого у меня был поддающийся проверке эквивалентный проект в git, однако все потерянные ветки, о которых я упоминал ранее, исчезли. Я не думаю, что это слишком серьезно, но я вполне могу пережить это как недосмотр. Поэтому моя последняя мысль в любом случае сохранить оригинал.
Изменить: Если вы просто хотите последний коммит в git, это проще, чем приведенное выше слияние:
hg book -r tip master
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
У меня была похожая задача, но она содержала некоторые аспекты, которые не были достаточно охвачены другими ответами здесь:
- Я хотел конвертировать все (в моем случае: две или вообще больше, чем одна) ветки моего репо.
- Я имел не-ASCII и (будучи пользователем Windows) не-UTF8-кодированные символы (для любопытных: немецкий umlaute) в моих сообщениях фиксации и именах файлов.
Я не пробовал fast-export и hg-fast-export, поскольку они требуют, чтобы на вашем компьютере были установлены модули Python и некоторые модули Mercurial Python, которых у меня не было.
Я попробовал hg-init с TortoiseHG, и этот ответ дал мне хорошее начало. Но, похоже, он только конвертирует текущую ветку, а не все сразу (*). Итак, я прочитал hg-init документы и этот пост в блоге и добавил
[git]
branch_bookmark_suffix=_bookmark
на мой mercurial.ini, и сделал
hg bookmarks -r default master
hg bookmarks -r my_branch my_branch_bookmark
hg gexport
(Повторите 2-ю строку для каждой ветви, которую вы хотите преобразовать, и повторите это снова, если вам придется выполнить еще один коммит перед выполнением 3-й строки). Это создает папку git
в .hg
, который оказывается голым репозиторием Git со всеми экспортированными ветками. Я мог клонировать этот репозиторий и иметь рабочую копию по желанию.
Или почти...
Бег
git status
на моей рабочей копии показывались все файлы с не-ASCII-символами в именах как неотслеживаемые файлы. Поэтому я продолжил исследования и последовал этому совету:
git rm -rf --cached \*
git add --all
git commit
И, наконец, репо было готово к отправке в Bitbucket:-)
Я также попробовал импортер Github, как упоминалось в этом ответе. Я использовал Bitbucket в качестве исходной системы, и Github отлично поработал, то есть он автоматически конвертировал все ветви. Однако в моих сообщениях фиксации (Web-UI и локально) и именах файлов (только Web-UI) он отображал символы "?" - все символы, не относящиеся к ASCII, и хотя я мог исправить имена файлов, как описано выше, я понятия не имел что делать с сообщениями фиксации, и поэтому я бы предпочел подход hg-init. Без проблемы с кодировкой импортер Github был бы идеальным и быстрым решением (если у вас есть платная учетная запись Github или вы можете терпеть, что ваше репо общедоступно в течение всего времени, необходимого для его переноса из Github на локальную машину).
(*) Итак, до того, как я обнаружил, мне нужно было добавить в закладки все ветви, которые я хочу экспортировать. Если вы сделаете это и перейдете к голому (!) Репо, как сказано в связанном ответе, вы получите все ответвления.
От:
http://hivelogic.com/articles/converting-from-mercurial-to-git
мигрирующий
Это относительно простой процесс. Сначала мы загружаем fast-export (лучший способ - через его Git-репозиторий, который я клонирую прямо на рабочий стол), затем мы создаем новый git-репозиторий, выполняем миграцию и проверяем HEAD. В командной строке это выглядит так:
cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
Вы должны увидеть длинный список коммитов, когда ваш проект переносится после выполнения fast-export. Если вы видите ошибки, они, вероятно, связаны с неверно указанным путем Python (см. Примечание выше и настройте его для вашей системы).
Вот и все, вы сделали.
Другой вариант - создать бесплатную учетную запись Kiln - круговые обходы между git и hg со 100% удержанием метаданных, так что вы можете использовать его для однократного преобразования или использовать его для доступа к хранилищу с помощью любого клиента, который вы предпочитаете.
Это было бы лучше в качестве комментария, извините, у меня нет разрешения на комментирование.
@ mar10 комментарий был недостающим фрагментом, который мне понадобился для этого.
Обратите внимание, что '/path/to/old/mercurial_repo' должен быть путем в файловой системе (не URL-адресом), поэтому вы должны клонировать исходный репозиторий раньше. - 10 марта 27 декабря 13:30
Этот комментарий касался ответа, который решил эту проблему для меня, /questions/13189010/preobrazovanie-papki-mercurial-v-repozitorij-git/13189022#13189022 который совпадает с ответом, помеченным здесь как правильный, /questions/40238557/konvertirovat-mercurial-proekt-v-git/40238563#40238563
Это переместило наш проект hg в git с сохранением истории коммитов.