Мне нужно преобразовать проект mercurial в проект git, но я хотел бы сохранить историю фиксации неповрежденной. Моим текущим решением было просто удалить hg связанные файлы, а затем git init && & добавьте вручную нужные мне файлы, но это не сохранит историю. Есть ли какие-либо решения для этого?
Преобразование проекта Mercurial в Git
Ответ 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:
- Включить
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 на не-голый.
Ответ 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 с сохраненной историей фиксации.