Совместимость Git с Mercurial Repository - PullRequest
193 голосов
/ 19 мая 2009

Я использую GIT на Mac. Достаточно сказано. У меня есть инструменты, у меня есть опыт. И я хочу продолжать его использовать. Здесь нет войн ...

Проблема всегда в совместимости. Большинство людей используют SVN, что отлично подходит для меня. Git SVN работает "из коробки" и является решением без излишеств. Люди могут продолжать счастливо использовать SVN, и я не теряю ни свой рабочий процесс, ни мои инструменты.

Теперь ... Некоторые ребята приходят с Mercurial. Хорошо для них: у них есть свои причины. Но я не могу найти GIT HG "из коробки". Я не хочу переключаться на HG, но мне все еще нужно взаимодействовать с их хранилищем.

Кто-нибудь из вас, ребята, знает простое решение для этого?

Ответы [ 10 ]

113 голосов
/ 13 ноября 2012

Существует новый git-remote-hg, который обеспечивает собственную поддержку:

Поддержка мостов в Git для Mercurial и Bazaar

Просто скопируйте git-remote-hg в ваш $ PATH, сделайте его исполняемым, и все, никаких зависимостей (кроме Mercurial):

git clone hg::https://www.mercurial-scm.org/repo/hg/

Вы должны иметь возможность толкать и извлекать его, как если бы это был собственный репозиторий Git.

Когда вы нажимаете новые ветки Git, для них создаются закладки Mercurial.

См. git-remote-hg wiki для получения дополнительной информации.

105 голосов
/ 07 июля 2009

Вы должны быть в состоянии использовать рт.ст. .

hg clone <hg repository>

изменить ~/.hgrc и добавить:

[extensions]
hgext.bookmarks =
hggit =

создайте закладку, чтобы у вас был master в git:

cd <repository>
hg bookmark -r default master

отредактируйте .hg/hgrc в хранилище и добавьте:

[git]
intree = true

теперь вы можете создать репозиторий git:

hg gexport

и вы можете использовать полученный каталог как клон git. вытащить из ртути будет:

hg pull
hg gexport

и отправка в Mercurial:

hg gimport
hg push

(Да, вам нужно использовать hg с этим рабочим процессом, но ваш взлом будет все в git)

P.S. Если у вас есть проблемы с этим рабочим процессом, пожалуйста, сообщите об ошибке.

58 голосов
/ 24 июня 2012

Обновление от июня 2012 года. В настоящее время, по-видимому, существуют следующие методы взаимодействия Git / Hg, когда разработчик хочет работать со стороны git:

  1. Установите Mercurial и расширение hg-git . Вы можете сделать последнее с помощью вашего менеджера пакетов или с помощью easy_install hg-git. Затем убедитесь, что в вашем ~ / .hgrc есть следующее:

    [extensions]
    hggit = 
    

    Вы также можете увидеть некоторые ссылки, в которых говорится об указании расширения bookmarks, но оно было встроено в Mercurial начиная с версии 1.8. Вот несколько советов по установке hg-git в Windows .

    Получив hg-git, вы можете использовать команды, примерно такие, как Abderrahim Kitouni, опубликованный выше . Этот метод был усовершенствован и улучшен с 2009 года, и есть дружественная оболочка: git-hg-again . Он использует каталог верхнего уровня в качестве рабочего каталога для Mercurial и Git одновременно. Он создает закладку Mercurial, которая синхронизируется с кончиком ветки default (без имени) в хранилище Mercurial, и обновляет локальную ветку Git из этой закладки.

  2. git-remote-hg - это другая оболочка, также основанная на расширении Mercurial hg-git. Это дополнительно использует протоколы git-remote-helpers (отсюда и его название). Он использует каталог верхнего уровня только для рабочего каталога Git; он хранит свой Mercurial репозиторий голым. Он также поддерживает второй пустой Git-репозиторий, чтобы сделать синхронизацию между Git и Mercurial более безопасной и более идиоматически похожей на git.

  3. Сценарий git-hg (ранее поддерживался здесь ) использует другой метод, основанный на hg-fast-export из проект быстрого экспорта . Как и в методе 2, здесь также хранится пустой репозиторий Mercurial и дополнительный пустой репозиторий Git.

    Для извлечения этот инструмент игнорирует закладки Mercurial и вместо этого импортирует каждую именованную ветку Mercurial в ветку Git, а ветку Mercurial по умолчанию (без имени) - в master.

    В некоторых комментариях этот инструмент рассматривается только как hg-> git, но в нем утверждается, что он объединен с поддержкой git-> hg push 7 декабря 2011 года. Как я объясню в обзоре этих инструментов , однако способ, которым этот инструмент пытается реализовать push-поддержку, кажется нереальным.

  4. Также есть другой проект под названием git-remote-hg . В отличие от версии, указанной выше, эта версия не зависит от hg-git, а напрямую обращается к API Mercurial Python. На данный момент для его использования также требуется исправленная версия git. Я еще не пробовал это.

  5. Наконец, Tailor - это проект, который постепенно преобразует различные VCS. Похоже, что развитие этого не будет продолжено агрессивно.

Первые три из этих подходов выглядели достаточно легкими, чтобы убедить меня провести расследование. Мне нужно было настроить их каким-то образом, чтобы они работали на моей установке, и я нашел несколько способов настроить их дальше, чтобы улучшить их, а затем я настроил их еще больше, чтобы заставить их вести себя как друг с другом, чтобы я мог оценить их более эффективно. Тогда я подумал, что другим тоже могут понравиться эти настройки, чтобы сделать ту же оценку. Итак, я сделал исходный пакет , который позволит вам установить мои версии любого из первых трех инструментов. Следует также позаботиться об установке необходимых hg-fast-export штук. (Вам нужно установить hg-git самостоятельно.)

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

Как я упоминал выше, при оценке этих инструментов я пришел к выводу, что git-hg можно использовать только для извлечения из Mercurial, а не для толкания.

Кроме того, вот несколько полезных руководств по сравнению / переводу между Git и Mercurial, в некоторых случаях предназначенных для пользователей, которые уже знают Git:

15 голосов
/ 19 мая 2009

Вы можете попробовать hg2git, который является скриптом Python и является частью быстрого экспорта, который вы можете найти по адресу http://repo.or.cz/w/fast-export.git.

Вам нужно будет установить Mercurial.

9 голосов
/ 21 мая 2009

Поскольку hg-git является мостом с двумя -путями, он также позволит вам передавать наборы изменений из Git в Mercurial.

6 голосов
/ 27 июня 2012

У меня был большой успех с git-hg из https://github.com/cosmin/git-hg (также требуется рабочая установка hg). Он поддерживает выборку, извлечение и push и является более стабильным для меня, чем hg-git (аналогичные функции от hg до git).

См. https://github.com/cosmin/git-hg#usage для примеров использования. Пользовательский интерфейс очень похож на git-svn.

git-hg требует дополнительного дискового пространства для каждого клонированного репозитория hg. Реализация использует полный ртутный клон, дополнительный клон git и реальное репозиторий git. Требуемое дисковое пространство примерно в 3 раза больше обычного использования GIT. Дополнительные копии хранятся в каталоге .git вашего рабочего каталога (или в месте, указанном GIT_DIR как обычно).

Примечание: Основная проблема, которую пытается решить git-hg, заключается в том, что между функциями git и hg нет сопоставления 1: 1. Самая большая проблема - это несоответствие импеданса между ветвями git и hg неназванными ветвями и hg именованными ветвями и hg закладками (все они очень похожи на ветви для git пользователей). Связанная проблема заключается в том, что hg пытается сохранить исходное имя именованной ветви в истории версий, в отличие от git, где имя ветви добавляется только в сообщение фиксации шаблона по умолчанию.

Любой инструмент, который утверждает, что создает совместимый мост между git и hg, должен объяснить, как он будет работать с этим согласованием импедансов. Затем вы можете решить, соответствует ли выбранное решение вашим потребностям.

Решение, которое использует git-hg, заключается в отбрасывании всех закладок hg и преобразовании именованных веток в ветви git. Кроме того, он устанавливает основную ветку git на неназванную ветвь hg по умолчанию.

6 голосов
/ 19 мая 2009

Hg-Git Mercurial Plugin . Сам не пробовал, но, возможно, стоит проверить.

3 голосов
/ 04 августа 2011

попробовал hggit. Работает для меня, так как я должен справляться с работой гитаристов и мастеров. Специально для обзоров это здорово.

Незначительная проблема / предупреждение на эту тему:

Я пытался клонировать стабильный репозиторий ядра Linux с помощью hg. Эти репозитории поддерживаются в git и обычно содержат большое количество файлов.

Это было очень медленно. Мне потребовалось 2 дня, чтобы полностью клонировать и обновить рабочую копию.

1 голос
/ 01 января 2014

Я пробовал git-hg от cosmin и git-hg-снова abourget оба на репозиторий рота Mutt , похоже, что последний уважает порядок слияние хорошо, первое немного случайно. Вы можете видеть на скриншотах ниже.

График истории слияния mutt, импортированного git-hg cosmin :

enter image description here

Граф истории слияния mutt, импортированный abitget's git-hg-again :

enter image description here

График истории всех событий, нанесенный hgk в репозиторий mutt hg:

enter image description here

Как видно из вышесказанного, второй граф с помощью abourget's git-hg-again очень близок к исходному графу hgk и фактически отражает реальный рабочий процесс дурака.

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

0 голосов
/ 30 апреля 2017

Двусторонняя синхронизация hg-git (и git-git, hg-hg) также возможна с помощью службы Зеркало Git-hg . Он использует hg-git (помимо прочего) за кулисами, и его код также имеет открытый исходный код.


Отказ от ответственности : Я из компании, стоящей за этим.

...