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

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

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

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

Любой из вас, ребята, знает простое решение для этого?

Ответ 1

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

  • Установите 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. В то же время он использует каталог toplevel как рабочий каталог для Mercurial и git. Он создает закладку Mercurial, которая синхронизируется с концом ветки default (unnamed) в репозитории Mercurial и обновляет локальную ветвь git из этой закладки.

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

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

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

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

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

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

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

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

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

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

Ответ 2

Там есть новый 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.

Ответ 3

Вы можете использовать hg-git.

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. Если у вас возникла проблема с этим документооборотом, напишите ошибку.

Ответ 4

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

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

Ответ 5

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

Ответ 7

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

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

Для git-hg требуется дополнительное дисковое пространство для каждого клонированного hg-репо. Реализация использует полный mercurial clone, дополнительный 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 для неактивной ветки hg по умолчанию.

Ответ 8

Попробовали hggit. Работает для меня, так как я должен справиться с работой git 'и hg'ers. Особенно для отзывов это замечательно.

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

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

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

Ответ 9

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

Ответ 10

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

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