Совместимость Git с Mercurial Repository

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

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

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

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

11 ответов

Решение

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

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

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

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

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

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

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

Есть новый 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 для получения дополнительной информации.

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

hg clone <hg repository>

редактировать ~/.hgrc и добавить:

[extensions]
hgext.bookmarks =
hggit =

создать закладку, так что у вас будет master в мерзавце:

cd <repository>
hg bookmark -r default master

редактировать .hg/hgrc в репозиторий и добавьте:

[git]
intree = true

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

hg gexport

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

hg pull
hg gexport

и толкая к ртути:

hg gimport
hg push

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Граф истории слияния mutt, импортируемый git-hg cosmin:

Граф истории слияния Mutt, импортированный https://github.com/abourget/git-hg-again:

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

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

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

Актуальный ответ в 2021 году кажется , который используется, например, Firefox.

Другие сценарии, предлагаемые на этой странице, либо не обслуживаются, либо требуют для работы устаревшего программного обеспечения (обычно python 2.7). Напротив, cinnabar работает с Python 3.5+ и поддерживается как минимум до даты написания.

После установки cinnabar вы можете либо клонировать репозитории Mercurial напрямую, добавив префикс hg:::

      git clone hg::https://hg.mozilla.org/mozilla-unified

Или добавьте или установите пульт на

      git remote set-url origin hg::https://hg.mozilla.org/mozilla-unified
git fetch origin

Вы можете нажать на ртутные пульты.

С использованием hg2git а также git2hgКоманды позволяют переводить git commit sha1s в mercurial changeset и обратно. Дополнительные документы доступны git cinnabarна странице github .

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


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

Другие вопросы по тегам