Конвертировать 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. Если вы не используете это, вы можете сделать это в командной строке.

  1. Установить TortoiseHg
  2. Щелкните правой кнопкой мыши пустое место в проводнике и перейдите к настройкам TortoiseHg:

Настройки TortoiseHg

  1. включить hggit:

введите описание изображения здесь

  1. Откройте командную строку, введите пустой каталог.

  2. git init --bare .git (Если вы не используете репо, вы получите сообщение об ошибке типа abort: git remote error: refs/heads/master failed to update

  3. cd в ваш репозиторий Mercurial.

  4. hg bookmarks hg

  5. hg push c:/path/to/your/git/repo

  6. В каталоге 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 с сохранением истории коммитов.

Другие вопросы по тегам