Вскоре я начну поддерживать линейку продуктов, содержащих варианты одного и того же встроенного программного обеспечения. Поскольку я играю с git уже год и очень ценю его, я, скорее всего, буду использовать его для контроля версий.
Я вижу несколько вариантов сохранения вариантов прошивки, но ни один из них меня не слишком радует. Какие лучшие практики вы применяете в своей работе?
Альтернативы, которые я могу придумать:
определяет. Предварительная обработка. Плюсы: все всегда присутствует в исходниках, сложнее пропустить обновление одного из продуктов. Минусы: сложнее читать. Это может быть нормально, пока у нас есть только два варианта, когда их станет четыре или больше, это будет больно. Кроме того, сложнее применить принцип DRY (не повторяйся).
одна ветвь на каждый вариант продукта. Если включены изменения, применимые ко всем продуктам, их необходимо объединить с другими продуктами. Минусы: если коммит содержит как изменения для всех продуктов, так и изменения для конкретного варианта, будут проблемы. Конечно, вы можете убедиться, что коммит содержит только один тип изменений: изменения этого продукта или изменения всего семейства. Но попробуй навязать это команде?? Кроме того, тогда слияние не сработает, вместо этого мы должны будем выбирать вишни. Верно?
основной репозиторий как подмодуль. Сделайте все файлы, содержащие основные функции, отдельным репозиторием. Все продукты содержат версию основного репозитория в качестве подмодуля. Минусы: я не вижу, чтобы в конечном итоге не было вариантов основного подмодуля. Затем у нас снова проблемы, и тогда мы снова будем использовать определения или что-то плохое. Основной репозиторий с ветками? Затем мы возвращаемся к предыдущему варианту: изменение, которое применяется ко всем ветвям, должно быть объединено, но слияние также включает в себя специфические для продукта вещи.
создайте репозиторий для каждого модуля. Например, репозиторий для драйвера дисплея, еще один для оборудования управления питанием, еще один для пользовательского интерфейса ввода, ... Плюсы: хорошая модульность. Сделайте новый продукт, просто подобрав нужные вам модули в качестве подмодулей! Все подмодули могут иметь ответвления, если, например, вариант использует аппаратное обеспечение по-другому. Минусы: много-много модулей, каждый из которых отслеживает пару файлов (включаемый файл и исходный файл). Хлопот. Кто-то делает важное обновление в каком-то модуле? Затем кто-то должен включить изменение в другие ветки этого модуля, если это уместно. Затем кто-то также должен обновить подмодуль в каждом репозитории продукта. Довольно много работы, и мы как бы теряем моментальную сторону git.
Как вы это делаете, и как это работает? Или как бы вы это сделали?
У меня есть ощущение, что я должен получить опыт в сборе вишни.