Объединение двух разных репозиториев
У меня есть 3 репозитория, A, B и C, все они связаны с одним проектом. A - самая старая версия проекта, B - эксперимент, который на самом деле никуда не делся, а C - последняя рабочая версия. Все эти репозитории имеют разные файлы - это разные реализации одного и того же продукта.
Я хотел бы объединить эти 3 репо в одно, сохраняя их историю - это жизненно важно. Я предполагаю, что хочу поместить B поверх A и C поверх B, но когда я оформляю проект, я хочу получить только изменения, связанные с репо C.
Моя идея состоит в том, чтобы пометить или создать именованную ветку на A, hg rm *, зафиксировать, а затем сложить B сверху. Повторите то же самое с B, чтобы я мог сложить C и затем продолжить проект как обычно.
Как вы думаете? Также немного вдохновения для того, что я хочу сделать: 1, 2.
1 ответ
Вы можете просто вытащить наборы изменений в один большой репозиторий. Начните с репо:
$ hg init combined
$ cd combined
$ hg pull ../A
$ hg update
Затем принудительно вытяните B и соедините две головки, чтобы сохранить файлы из B:
$ hg pull ../B --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge A and B, kept B"
Затем повторите для C:
$ hg pull ../C --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge B and C, kept C"
Это дает вам три линии истории и точку слияния, где вы сначала отбрасываете A, затем B и, наконец, получаете C.
В качестве альтернативы вы можете использовать расширение convert с картой сплайсинга, чтобы объединить три истории вместе. Начните с принудительного извлечения всех наборов изменений в один репозиторий. Затем выполните преобразование Mercurial в Mercurial, где вы добавляете кончик A в качестве первого родителя корня B. Аналогично для B и C. Это дает вам одну длинную историю, в которой произойдет очень резкое изменение, когда вы перейдете от A к B и от B до C.
Я бы выбрал первый вариант: он наиболее явный и лучше всего показывает, что происходит без фальсификации (преобразования) истории.