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

195

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

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

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

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

Уго Серено Феррейра
источник
4
hg-git работает в обоих направлениях.
Дерек Махар
1
Ответ @dubiousjim является более полезным, всеобъемлющим и более актуальным, чем текущие два топа, которые указывают на необслуживаемые репо или дают устаревшие советы. Но все же больше обновлений по этому вопросу было бы очень полезно.
nealmcb

Ответы:

60

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

  3. ГИТ-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:

dubiousjim
источник
2
Я сам использую метод №2, точнее, его подправленную версию. В целом это кажется мне наиболее надежным и гибким подходом (из тех, которые я пробовал). Смотрите ссылки на мой обзор / пакет источника для деталей.
dubiousjim
Ага. Печь Гармония потрясающая. Бесплатно для индивидуальных разработчиков.
САПР bloke
114

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

FelipeC
источник
14
Эй, Фелипе, это не совсем так, вам нужна рабочая версия Mercurial в качестве зависимости
Antoine Pelisse
5
Убедитесь, что вы называете это точно git-remote-hg(т.е. без .pyсуффикса).
Шммм
3
Работает, когда репозиторий hg также является подмодулем.
Клейтон Стэнли,
4
Обратите внимание, что вам нужен python 2. Поэтому, если в вашей системе по умолчанию используется python 3 (или если вы не запускаете Debian и хотите быть в будущем), измените первую строку на #!/usr/bin/env python2.
Кевин Кокс
4
Обратите внимание, что начиная с Mercurial 3.2, git-remote-hg @FelipeC больше не работает ( github.com/felipec/git-remote-hg/issues/27 ), то есть до тех пор, пока не будет объединена вилка, исправляющая проблему (см. Github). .com / fingolfin / git-remote-hg )
Cimbali
106

Вы должны быть в состоянии использовать 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

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

hg gimport
hg push

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

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

Абдеррахим Китуни
источник
3
не забудьте сначала запустить easy_install hg-git
Christian Oudard
1
Не совсем то, что я хотел, но все же выполнимо. Спасибо.
Уго Серено Феррейра
3
Просто к сведению, после того, как я однажды запустил этот процесс на локальном репозитории hg (и сделал что-то не так), я не смог клонировать полученное репо с помощью git. Мне пришлось «hg clone» исходного репозитория hg, выполнить шаги нового репозитория hg, а затем git clone нового репозитория hg.
Рокки Бёрт
1
Я получаю это при попытке выполнить git statusкоманду $ git status fatal: эта операция должна выполняться в рабочем дереве Это после того, как я выполнил команду hg gexportв только что клонированном репозитории hg. Как можно обойти голые репозитории? Обновление . Судя по всему, предложение Рок Берта работает. Спасибо
yesudeep
1
@ ТаДон У меня такая же проблема. Очевидно, git-репо создается как .hg / git. Решением является 'ln -s .hg / git .git'.
mb14
15

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

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

Сикора
источник
4
Это преобразовало hg-репо в git-репо, большое спасибо!
переназначить
Этот сценарий не удался для меня, но оригинал hg-fast-exportработал нормально
Андрей
Я думаю, что в настоящее время hg-fast-exportскрипт отправляет hg2git. Я не проследил все это, хотя. Обратите внимание, что эти инструменты позволяют переходить только из Hg-> Git, а не наоборот.
dubiousjim
9

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

Мартин Гайслер
источник
6

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

ralphtheninja
источник
7
Это плагин, который позволяет пользователям Mercurial вставлять и извлекать из репозиториев git, а не наоборот, чего и хочет OP.
Сикора
1
@sykora, он также может использоваться для обеспечения взаимодействия в обратном направлении. Посмотрите некоторые инструменты, которые я перечислил в моем ответе.
dubiousjim
6

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

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

git-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 master на неименованную ветку hg по умолчанию.

Микко Ранталайнен
источник
Похоже, что git-hgэто возможно только для извлечения из Hg, а не для подталкивания (см. Объяснение, на которое я ссылаюсь в моем ответе). Вы нашли способ успешно использовать его в обоих направлениях? Что касается дополнительного пространства, все техники, с которыми я знаком, включают в себя рабочий каталог + одну копию git db / metadata + одну копию hg db / metadata. Добавление второй копии git db / metadata требует большего использования диска, да, но, сравнительно говоря, это не так плохо, как может показаться.
dubiousjim
@dubiousjim Мои потребности были удовлетворены рабочим извлечением / извлечением, и я никогда не проверял толчок. Я доверял документации, но после проверки ваших объяснений теперь я считаю, что git-hgэто не подходит для толкания. Я изменил свой ответ, чтобы было понятнее, что pushон недостаточно стабилен.
Микко Ранталайнен
Жаль, я думал, что может быть какой-то способ успешно использовать толчок, которого я не видел.
dubiousjim
1
+1 за выделение несоответствия импеданса и что искать
Мэтт Уилки
3

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

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

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

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

Wizz
источник
Похоже, мне становится лучше - моя касса работает уже около шести часов, и в ней утверждается, что осталось еще девять ...
Дэвид, учитывая
Я забираю это обратно. Сейчас он работает около 25 часов, и все еще утверждает, что осталось только девять. Два дня, ты сказал?
Дэвид Дай
1
Я испытал это - моя первая попытка не сработала вообще - я предполагаю, что это была какая-то ошибка, но никогда не анализировал ее дальше, со второй попытки - с обновленным hg-git на моем Mac Book ушло почти 50 часов Pro (2,66 ГГц, 8 Гб оперативной памяти)
Wizz,
39 часов, так что осталось только 11! Четырехъядерный процессор AMD Phenom. Это является достижение прогресса, поэтому я позволяю запустить его (расширение рт.ст. прогресс бар является обязательным). Он чередуется между привязкой одного процессора и вообще без использования процессора, а также с большим доступом к диску.
Дэвид Дай
Кто-нибудь проверял, является ли плохая производительность, вызванная hggitили hgслишком медленной, чтобы ее можно было использовать с проектами размера ядра в целом?
Микко Ранталайнен
1

Я попытался Космин в GIT-ртутных и abourget - х ГИТ-HG-снова , как на рт.ст. репо Mutt в , кажется , что более поздние Уважает порядок слияния хорошо, бывший немного случайным. Вы можете увидеть на скриншотах ниже.

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

weynhamz
источник
1
Мне кажется, что различия между версиями от cosmin и abourget - порядок родителей в коммитах. Хороший инструмент визуализации истории (например gitk) должен уметь одинаково отображать обе истории. Единственное, чего явно не хватает - это ветки hg/stableв версии от abourget. Я предполагаю, что это вещь между именованными ветками, неименованными ветками и закладками в Mercurial.
Микко Ранталайнен
0

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


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

Piedone
источник