Объединение двух разных хранилищ

У меня 3 репозитория, A, B и C, все связанные с тем же проектом. A - старейшая версия проекта, B - эксперимент, который на самом деле никуда не делся, а C - последняя рабочая версия. Все эти репозитории имеют разные файлы - они разные реализации одного и того же продукта.

Я хотел бы объединить эти 3 репозитария в один, сохраняя их историю - это жизненно важно. Наверное, я хочу складывать B поверх A и C поверх B, но когда я проверяю проект, я хочу получить изменения, связанные с repo C.

Моя идея состоит в том, чтобы пометить или создать именованную ветку на A, hg rm *, commit и затем свернуть B сверху. Повторите то же самое с B, чтобы я мог нагромождать C, а затем продолжить проект, как обычно.

Как вы думаете? Кроме того, некоторое вдохновение для того, что я хочу сделать: 1, 2.

Ответ 1

Вы можете просто поместить изменения в один большой репозиторий. Начните с A repo:

$ 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.

В качестве альтернативы вы можете использовать расширение конвертации с помощью карты сплайсов, чтобы объединить три истории вместе. Начните с принудительного вытягивания всех наборов изменений в один репозиторий. Затем выполните преобразование Mercurial в Mercurial, где вы добавляете кончик A в качестве первого родителя корня B. Аналогично для B и C. Это дает вам одну длинную историю, где произойдет очень резкое изменение, когда вы переходите от A до B и от B до C.

Я бы выбрал первый вариант: он наиболее явный и показывает лучшее, что происходит, не притворяя (конвертируя) историю.