объединение связанных репозиториев git с сохранением истории / веток - PullRequest
11 голосов
/ 28 сентября 2011

у нас есть 3 отдельных репозитория git (в каждом есть несколько веток), которые мы хотели бы объединить в одно, сохраняя полную историю и возможность доступа к веткам, например:

так вот что мы имеем. 3 репо:

/A/.git
/B/.git
/C/.git

и мы хотели бы иметь один супер-репо с 3 подкаталогами:

super/.git
super/A
super/B
super/C

и скажем, что при переходе на ветку feature1 (которая изначально была в репо B, введена в то время, когда репо C еще не существовало) мы ожидаем, что результат будет:

super/.git
super/A
super/B

мы прочитали Объединение нескольких репозиториев git , но возникли проблемы с использованием git-stitch-repo, который в основном работал так, как рекламировалось, только из-за того, что в супер-репо отсутствовало достаточно большое количество коммитов (без каких-либо ошибок сообщения, которые указывают на проблему).

Есть идеи, что мы могли бы делать здесь неправильно?

EDIT нам известны субмодули и слияния поддеревьев, но оба варианта не возможны. это должна быть разовая операция. нам нужны репо, объединенные раз и навсегда.

EDIT вероятно, более простой способ поставить в основном тот же вопрос: скажем, у нас есть один репо с 3 совершенно не связанными ветками. мы можем объединить их без конфликта в одну ветку (так как они не разделяют файлы). теперь, когда мы смотрим на историю, мы видим 3 не связанные ветви коммитов и одну точку, где они собираются вместе. но мы хотели бы видеть одну ветвь, состоящую из чередующихся (по дате / времени) коммитов всех трех ветвей.

Ответы [ 3 ]

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

Вам не нужны субмодули, так как вы будете выдергивать свои волосы со всеми командами обновления git submodule, которые вы будете выдавать.Вам также нужно будет выполнить 3 команды git log вместо одной, чтобы увидеть, что произошло за определенное время.

Объедините все истории в одном репо.Используйте filter-branch для сброса каталогов, в которых находится каждая история репозитория. Сшивать не нужно.Вы можете просто объединиться в любой момент, как только вы выполните ветку фильтра.

По существу, repoA / master, repoB / master и repoC / master будут существовать в новом создаваемом вами репо (хотя вы можете просто начать с одного из них).).После применения ветви фильтра каждое дерево в каждом коммите будет иметь новый корневой узел, который будет каталогом (A для ветвей repoA, B для ветвей repoB и т. Д.).

ИЛИ

git checkout -b newbranch --root
git log --all --format=%ad%H | sort | cut -c10- | xargs -n 1 git cherry-pick

отрегулируйте срез, чтобы он занимал только хэш.Не пробовал это, но дайте мне знать, как это работает.Возможно, вам придется сначала сгладить историю с помощью rebase.Вы не можете чередовать различные ветви и слияния из 3 разных историй.

надеюсь, это поможет.

1 голос
/ 26 июня 2014

splice_repos - это инструмент, который я написал, который чередует коммиты из разных репозиториев в новый репозиторий, так что одноименные ветви получают объединенные истории (как если бы они были зафиксированы в историческом порядке), а не просто объединение в конце с отдельными историями на разных ветвях. За этим стоит запись в блоге, описывающая обоснование .

0 голосов
/ 28 сентября 2011

Вероятно, самый простой способ сделать это - использовать подмодули . Это не совсем относится к делу, которого вы хотите достичь, но это чертовски близко и не очень склонны к головной боли.

Просто создайте новый каталог и запустите его в качестве своего «супер» репо. Затем добавьте свои репозитории A, B и C, используя команды, приведенные по ссылке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...