Подтвердить что ты не робот

Как связать существующие репозитории Mercurial и git с помощью hg- git?

Это довольно эзотерический вопрос, поэтому просто для того, чтобы четко прояснить это с самого начала: я не говорю о преобразовании из 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, и я хочу начать втягивать изменения из нового upstream git, начиная с изменения, произошедшего сразу после того, как репозиторий svn был перемещен в github.

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

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

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

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

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

4b9b3361

Ответ 1

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

То, что вам нужно сделать, это ветвь, которая представляет все выше по течению, которые, как вы знаете, уже объединены в ваше дерево, а затем выполните стиль no-op слияния в ваше дерево, а затем начните вносить изменения с "реальными" слияниями.

С этого сайта:

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

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

Интересный проект, кем бы он ни был.:)

Ответ 3

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