Преобразование Mercurial project в Git [дубликат]

этот вопрос уже есть ответ здесь:

Мне нужно преобразовать проект mercurial в проект git, но я хотел бы сохранить историю фиксации нетронутой. Мое текущее решение состояло в том, чтобы просто удалить HG связанные файлы, а затем git init && add вручную файлы, которые мне нужны, но это не сохранит историю. Есть ли какие-то решения?

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 Settings

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

enter image description here

  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 к не-голому.


Если вы хотите импортировать существующий репозиторий mercurial в репозиторий "GitHub", теперь вы можете просто использовать Импортер GitHub скачать здесь [требуется регистрация]. Нет больше возиться с фаст-экспорт etc. (хотя это очень хороший инструмент)

вы получите все ваши commits, отделения и теги нетронутыми. Еще одна интересная вещь заключается в том, что вы можете изменить автора также. Проверьте скриншоты ниже:

enter image description here

enter image description here


некоторые заметки моего опыта преобразования Mercurial в Git.

1. hg-fast-экспорт

использование hg-fast-export не удалось ,и мне нужно было -- force, как указано выше. Затем я получил эту ошибку:

ошибка: не удается заблокировать ref "refs / heads / stable": "refs/heads/stable/sub-branch-name" существует; не удается создать "refs/heads / stable"

по завершении HG-fast-export я закончил с ампутированным РЕПО. Я думаю, что у этого РЕПО было несколько осиротевших ветвей и этот hg-fast-export нуждается в несколько идеализированном РЕПО. Все это казалось немного грубым по краям, поэтому я перешел к печи гармонии (http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/)

2. Печь

гармония печи, по-видимому, не существует на свободной учетной записи уровня, как предложено выше. Я мог бы выбрать между репозиториями git-only и Mercurial-only, и нет возможности переключиться. Я поднял билет и поделюсь результатом, если они отвечать.

3. hg-git

плагин HG-Git mercurial (http://hg-git.github.io/) работал на меня. FYI на Mac OSX я установил hg-git через macports следующим образом:

  • sudo порт установки python27
  • sudo port select --установить 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.

при первом нажатии проекта per (3) я закончил со всеми новыми изменениями, отсутствующими. Это потому, что эта строка кода должна рассматриваться только в качестве примера:

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

теория заключается в том, что ветвь по умолчанию может считаться master при нажатии на git, и в моем случае я унаследовал РЕПО, где они использовали "стабильный" в качестве эквивалента 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, однако все осиротевшие ветви, о которых я упоминал ранее, исчезли. Я не думаю, что это слишком серьезно, но я вполне могу сожалеть об этом как о недосмотре. Поэтому моя последняя мысль-сохранить оригинал.

Edit: если вы просто хотите последнюю фиксацию в git, это проще, чем вышеупомянутое слияние:

hg book -r tip master
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git

другой вариант-создать бесплатную учетную запись печи -- Печь туда и обратно между git и hg с сохранением метаданных 100%, чтобы вы могли использовать ее для однократного преобразования или использовать ее для доступа к репозиторию, используя любой клиент, который вы предпочитаете.


From:

http://hivelogic.com/articles/converting-from-mercurial-to-git

перенос

Это относительно простой процесс. Сначала мы загружаем fast-export (лучший способ-через его репозиторий Git, который я клонирую прямо на рабочий стол), затем мы создаем новый репозиторий git, выполняем миграцию и проверяем голову. В командной строке это выглядит так:

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

вы должны см. длинный список коммитов, пролетающих по мере переноса проекта после быстрого экспорта. Если вы видите ошибки, они, вероятно, связаны с неправильно заданным путем Python (см. Примечание выше и настроить для вашей системы).

вот и все, вы закончили.


у меня была аналогичная задача, но она содержала некоторые аспекты, которые не были достаточно охвачены другими ответами здесь:

  • Я хотел, чтобы преобразовать все (в моем случае: две или вообще: более одной) ветви моего РЕПО.
  • у меня были не-ASCII и (будучи пользователем Windows) не-UTF8-закодированные символы (для любопытных: немецкий umlaute) в моих сообщениях фиксации и именах файлов.

Я не пробовал быстро-экспорт и hg-fast-export, так как они требуют, чтобы у вас был Python и некоторые модули Mercurial Python на вашем компьютере, которых у меня не было.

Я пробовал hg-init с TortoiseHG, и ответ дал мне хорошее начало. Но похоже, что он только преобразует текущую ветвь, а не все сразу (*). Поэтому я прочитал HG-init docs и этот блог и добавил

[git]  
branch_bookmark_suffix=_bookmark

моему ртутному.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 сделал довольно хорошую работу, т. е. он автоматически преобразовал все ветви. Тем не менее, это показало?'- символы для всех символов, отличных от ASCII, в моих сообщениях фиксации (Web-UI и локально) и имена файлов (только Web-UI), и хотя я мог исправить имена файлов, как описано выше, я понятия не имел, что делать с сообщениями фиксации, и поэтому я предпочел бы подход HG-init. Без проблемы с кодировкой импортер Github был бы идеальным и быстрым решением (до тех пор, пока у вас есть платная учетная запись Github или вы можете терпеть, что ваше РЕПО является общедоступным до тех пор, пока это требуется, чтобы вытащить его из Github на локальную машину).


(*) так это выглядело до I обнаружил, что мне нужно пометить все ветви, которые я хочу экспортировать. Если вы это сделаете и нажмете на голой (!) РЕПО, как говорится в связанном ответе, вы получаете все ветви.


Это было бы лучше в качестве комментария, извините, у меня нет разрешений для комментариев.

@mar10 комментарий был недостающий кусок мне нужно было сделать это.

обратите внимание, что "/path/to/old/mercurial_repo " должен быть путем в файловой системе (а не URL), поэтому вам нужно клонировать исходный репозиторий раньше. - mar10 Dec 27 ' 13 в 16: 30

этот комментарий был в отношении ответа, который решил это для меня, https://stackoverflow.com/a/10710294/2148757 который является тем же ответом, что и отмеченный здесь правильный,https://stackoverflow.com/a/16037861/2148757

Это переместило наш проект hg в git с неповрежденной историей фиксации.