Как мне связать существующие репозитории Mercurial и git с помощью hg-git? - PullRequest
18 голосов
/ 21 сентября 2011

Это довольно эзотерический вопрос, поэтому просто поясню здесь с самого начала: я не говорю о преобразовании svn в git, git в mercurial или mercurial в git. Я говорю о сложной ситуации, возникшей в результате использования «межсистемных» плагинов, которые позволяют Mercurial до некоторой степени взаимодействовать с git и SVN.

Некоторое время я использовал плагин hg-subversion для Mercurial, чтобы «отслеживать» вышестоящий SVN-репозиторий на code.google.com. Благодаря этому плагину Mercurial считает, что репозиторий «связан», и может извлекать только те изменения, которые произошли с тех пор, как я в последний раз вынимал репо. Это позволяет мне поддерживать свой собственный частный репозиторий Mercurial, который включает в себя частные наборы изменений, ветви, теги и т. Д., Но который периодически синхронизируется и объединяется с изменениями, которые происходили в восходящем репозитории SVN.

Репо вышестоящего репозитория чисто переместился из SVN в git. Когда я говорю чисто, я имею в виду, что они взяли с собой все дерево коммитов или, по крайней мере, ту часть, которая затрагивает ветку default / master, о которой я забочусь.

Сейчас я нахожусь в ситуации, когда у меня есть Mercurial-репозиторий, который обновлен до самой последней проверки в ныне несуществующем SVN-репозитории, и я хочу начать вносить изменения из нового восходящего git-репозитория начиная с изменения, произошедшего сразу после перемещения хранилища svn в github.

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

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

Я вижу, что внутренне hg-git, похоже, использует файл .hg / git-mapfile, который, я полагаю, отображает наборы изменений между вышестоящим git и локальным репозиторием Mercurial. Это, вероятно, ключ.

Какой самый простой способ перевести мой локальный репозиторий Mercurial в такое состояние, когда он по сути ведет себя так, как если бы он начинался как клон вышестоящего репозитория git, но поддерживает все мои собственные несвязанные наборы изменений, которые были добавлены со временем?

(Примечание: я бы предпочел не «начинать заново» со свежим клоном, а затем применять свои личные изменения, потому что я хочу сохранить историческую целостность этого хранилища для своих собственных целей сборки / отладки).

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Я делал что-то похожее с git раньше.В случае с git-> git я смог выполнить git-merge --strategy = ours, что в основном заставило мой текущий репозиторий поверить, что все, что было объединено, было неактивным.

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

Сэтот сайт:

https://www.mercurial -scm.org / wiki / TipsAndTricks # Keep_.22My.22_or_.22Their.22_files_when_doing_a_merge

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

$ hg --config ui.merge=internal:local merge #keep my files

Это должно позволить вам повторно синхронизировать нисходящий поток с восходящим.

2 голосов
/ 21 сентября 2011

Я бы клонировал новый вышестоящий репозиторий с помощью Hg-git, а затем попытался использовать расширение Convert, чтобы объединить все изменения старого локального репозитория с новым. Фактически, я бы, вероятно, клонировал локальный репозиторий Hg-git в собственный репозиторий Mercurial и использовал бы двухэтапное извлечение из верхнего Git-репозитория.

1 голос
/ 21 сентября 2011

Если существующего решения не существует, я полагаю, можно было бы написать скрипт, который исправит и зафиксирует ваши изменения в новом хранилище, основанном на git-clone. Вам просто нужно сопоставить версии SVN между hg-git-fromsvn и hg-svn и реплицировать последовательность обновления / исправления / фиксации / слияния, которую вы сделали в новом репо.

Веселый проект для тех, кто это делает. :)

...