Сразу отмечу, что я работал только с Mercurial, но думаю советы и от пользователей Git тоже подойдут, так как принцип работы схожий.
Есть несколько веб проектов (сайты) на общей кодовой базе (самописная cms), которая постоянно обновляется. Уникальные модули и компоненты проектов также постоянно обновляются, всё происходит в разные промежутки времени в зависимости от найденных недочётов и требований проектов.
Проекты имеют папку
engine с одинаковыми файлами, папку
modules со смешанными файлами (часть используется во всех проектах, часть уникальна для конкретного проекта и другим они не к чему) и папку
templates, где есть папка с шаблоном проекта и папка с шаблоном "по умолчанию" - заготовка к новым проектам. Все проекты веду только я, в будущем надеюсь подключить помощников, но с таким зоопарком версий это пока сложно, и пока речь не об этом.
Назовём файлы с кодом, который используется во всех проектах -
"общие компоненты", а файлы с кодом который в каждом проекте уникален -
"уникальные компоненты".
Сейчас у меня на каждом проекте работает свой независимый Mercurial, просто для поддержания истории версий и пуша на удаленный сервер. Для того чтобы перебросить общие компоненты между проектами, делаю сравнение и тупо копирую из папки в папку, что не удобно -
приходится каждый раз вспоминать в каком файле делал обновления с момента прошлого копирования, и не правил ли я в том проекте ещё чего то, о чём забыл, что чревато убийством нужного кода.Что мне нужно:
- выделить базу
общих компонентов из всех проектов, без
уникальных (разве что шаблон по умолчанию, чтобы было на чём основывать новые проекты).
- если в одном проекте обновился
уникальный компонент, то он должен добавится в коммит этого проекта, но не должен повлиять на изменения файлов в других проектах. А если обновился файл из
общих компонентов, то он должен стать доступным для обновления во всех проектах.
- возможность обновлять всю кодовую базу общих компонентов на всех проектах сразу.
- возможность создавать новые проекты, как на основе только общей базы так и какого-либо из проектов, но при этом обновляться дальше только "общими компонентами", а не тянуть за собой изменения в проекте, с короткого склонировались.
Это тоже надо, но после, тк.как сложно - отдельным вопросом стоит файл текстовой базы, они должны частично обновляться но при этом сохранять свою уникальность. Пример. Есть фал texsts.php, общий и уникальный одновременно: переменная maintext содержит в себе приветственный текст, который на каждом сайте уникален, но для новых проектов есть заготовка. И тут я захотел добавить новую переменную hellotext, которая будет использоваться в новой возможности общей компоненты (для вывода приветственного сообщения пользователю), но ранее этой переменной не было совсем. Она должна появиться во всех проектах, но при не затереть переменную maintext.
- а ещё надо обновлять структуру базы данных без самих данный, даже не знаю как такое сделать
Как я себе это вижу:
- надеюсь, что как то можно взять одну папку с
общими компонентами за эталон, а остальные файлы, которые встречаются в проектах, считать
уникальными компонентами. Перспектива писать огромный список файлов для игнора к каждому проекту в отдельности не очень радует.
Я почему то верю, что система управления версиями как то это может, но не могу сообразить как, приведите пример, кто сталкивался с такой ситуацией.
Если что то непонятно описал, пишите я перефразирую.