Жил-был один проект. Жил он тихо мирно в своем репозитории и постепенно обзаводился друзьями-проектами, жившими в своих репозиториях. И вот захотели они сьехать на одну квартиру, дабы экономить на квартплате и чаще видеться друг с другом, и позвали девелопера что бы он им помог.
Вот такая вот сказочка. Собственно задача такова: создать родительский проект maven содержащий историю всех подпроектов, находившихся ранее в отдельных репозиториях. В принципе это очень просто делается по этой инструкции. Но если следовать данной инструкции у репозитория получится несколько хвостов (как на рисунке ниже).
1 2 3 4 5 6 7 8 9 10 |
|
Мне бы хотелось видеть историю в виде примерно такого графа:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Перфекционист во мне не удовлетворился таким положением дел, и в итоге, после пары часов консольной магии, было найдено следующее решение.
Сделаем ход конем и изменим историю так что бы было похоже на то что изначально разработка велась в подпапках основного репозитория. Это необходимо для того, что бы исключить конфликты файлов при последующем слиянии. Что бы провернуть это, экспортируем патч и изменим пути файлов. (Здесь и далее я буду считать что все репозитории находятся на одном уровне в файловой системе)
1 2 3 4 5 6 7 8 9 10 |
|
Для каждого из проектов делаем тоже самое (достаточно поменять только переменную PROJECT
в начале скрипта)
Если вместо того что бы плодить безымянные ветки вы захотите разнести историю отдельных проетов по именованым веткам, то достаточно для всех проектов кроме первого выполнить следующие команды, для добавления информации об имени ветки в патч:
1 2 |
|
После того как мы создали патчи для каждого из проектов, сольем их в один. В первую очередь инициализируем новый репозиторий агрегирующий историю всех проектов.
1 2 |
|
Для всех остальных проектов делаем следующие махинации:
- Обновляем репозиторий до ревизии из которой будет начинаться проект
- Импортируем соответствующий патч (Если было указано имя бранча то не стоит забывать про ключ
--import-branch
) - Мержим ветки
- Повторяем для оставшихся патчей
Этот подход проиллюстрирован ниже. Для способа без использования именованых веток действий нужно сделать немного меньше и в принципе можно легко автоматизировать процесс:
1 2 3 |
|
Если же использовались именованые ветки то стоит делать так:
1 2 3 4 5 6 7 |
|
По мотивам данной статьи был создан скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Буду рад если кому нибудь поможет эта статья. Замечания приветствуются.