Преобразование проекта Mercurial в Git

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

Ответ 1

Вы можете попробовать использовать быстрый экспорт:

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

Также взгляните на этот ТАК вопрос.


Если вы используете версию Mercurial ниже 4.6, adrihanu вернется:

Как он заявил в своем комментарии: "В случае, если вы используете Mercurial & lt; 4.6, и вы получили ошибку" revsymbol not found ". Вам нужно обновить ваш Mercurial или понизить экспресс-экспорт, запустив git checkout tags/v180317 внутри ~/fast-export". каталог. ".

Ответ 2

Хорошо, я наконец-то справился. Это использование TortoiseHg в Windows. Если вы не используете это, вы можете сделать это в командной строке.

  • Установить TortoiseHg
  • Щелкните правой кнопкой мыши пустое пространство в проводнике и перейдите к настройкам 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 на не-голый.

Ответ 3

Если вы хотите импортировать существующий ртутный репозиторий в репозиторий "GitHub", теперь вы можете просто использовать GitHub Importer здесь [Вход требуется]. Больше не возиться с быстрым экспортом и т.д. (Хотя это очень хороший инструмент)

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

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

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

Ответ 4

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

1. HG-быстро-экспорт

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

error: невозможно заблокировать 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. Печной

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

3. Hg-git

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

  • sudo port install python27
  • sudo port select --set python python27
  • sudo port install py27-hggit
  • vi ~/.hgrc

.hgrc нуждается в следующих строках:

[ui]
username = Name Surname <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

У меня был успех:

hg push git+ssh://[email protected]: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" как эквивалент мастера. Более того, я также обнаружил, что кончик репо был исправлением, которое еще не слилось со "стабильной" ветвью.

Без должного понимания как Mercurial, так и репо, которое нужно преобразовать, вам, вероятно, лучше не делать преобразования.

Я сделал следующее, чтобы вернуть репо для второй попытки конверсии:

hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://[email protected]:myaccount/myrepo.git

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

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

hg book -r tip master
hg push git+ssh://[email protected]:myaccount/myrepo.git

Ответ 5

From:

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

Перенастройка

Это относительно простой процесс. Сначала мы загружаем быстрый экспорт (лучший способ - через репозиторий Git, который Ill клонирует прямо на рабочий стол), затем мы создаем новый репозиторий 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

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

Это, ты сделал.

Ответ 6

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

Ответ 7

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

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

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

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

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


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

Ответ 8

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

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

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

Этот комментарий был в отношении ответа, который решил это для меня, fooobar.com/info/33146/..., который является тем же самым ответом, что и тот, который помечен правильно здесь, fooobar.com/info/33144/...

Это перенесло наш проект hg на git с сохраненной историей фиксации.