Преобразование Mercurial project в Git [дубликат]
этот вопрос уже есть ответ здесь:
- преобразование папки Mercurial в Git 5 ответов
Мне нужно преобразовать проект 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. Если вы не используете это, вы можете сделать это в командной строке.
- Установить 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 к не-голому.
Если вы хотите импортировать существующий репозиторий mercurial в репозиторий "GitHub", теперь вы можете просто использовать Импортер GitHub скачать здесь [требуется регистрация]. Нет больше возиться с фаст-экспорт etc. (хотя это очень хороший инструмент)
вы получите все ваши commits, отделения и теги нетронутыми. Еще одна интересная вещь заключается в том, что вы можете изменить автора также. Проверьте скриншоты ниже:
некоторые заметки моего опыта преобразования 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 с неповрежденной историей фиксации.