Субрепо подход
Когда я вас правильно понимаю, ваш репо выглядит так:
root
+ main
+ sub_1
+ sub_2
+ sub_N
Где main действует как своего рода библиотека или инфраструктура, а sub_1..sub_N - это более или менее разные ветви одного и того же программного обеспечения. Одним из решений было бы разместить main как подмодуль sub_1..sub_N, поэтому в конце дерево будет выглядеть как
root
+ main (=submodule)
+ source of sub_X, = on branch sub_X
Здесь все ваши sub_1..sub_N папки являются разными ветвями одного репо, а ваша главная / папка - другим репо. Это возможный способ, если все папки sub_X являются производными от общей базы, и на этой общей основе легко разрабатывать и выполнять слияние из общей базы в ветви sub_X для распространения этих изменений. Но у этого сценария есть большой недостаток: ему нужно, чтобы каждый, кто разрабатывает с этой структурой, точно знал, что он делает, так как разработка в ветви sub_X нелегко распространить на общую базу или другие ветви sub_Y посредством слияния, так как слияние операция будет не только передавать новые изменения в другие ветви, но также и изменения, которые отличают ветку sub_X от base или sub_Y. Так что, в общем, я бы советовал против такого подхода.
Специализация
Другой подход состоит в том, чтобы изолировать изменения sub_X и создать базовую версию, которая состоит из всех элементов, которые одинаковы в sub_1..sub_N, так что папки sub_X only состоят из специализированных элементов. Это зависит от вашей стратегии разработки / развертывания.
Реальные ветви
Поскольку вы писали, что папки sub_X являются копиями main, похоже, что main уже действует как общая база для всех папок sub_X. Если это так, вы можете изменить различные папки на ветви. Вы можете достичь этого,
- создание ветки для основной папки (
git checkout -b main
)
- удалить все элементы sub_X
- переместить все основные / * вещи в /
совершить
для каждой папки sub_X
- создать ветку sub_x на основе main (
git checkout -b sub_x main
)
- удалить все, кроме папки sub_X
- переместить все элементы sub_x в /
- совершить
После этого у вас есть график версий, подобный этому:
-o-o-(past history) - main -- sub_1
/ \--sub_2
-o-- \--sub_N
Затем вы можете разрабатывать новые функции в основной ветви и объединять эти функции с ветками sub_X. Главное в настройке с несколькими ветвями состоит в том, что вам всегда необходимо выбрать правильную начальную точку для новой разработки, поскольку операция объединения будет передавать нежелательные изменения между ветвями, если вы не использовали правильный запуск точка. Правильная отправная точка - это ревизия, которая является прародительницей всех ветвей, куда должно идти новое изменение. Если вы хотите разработать исправление для чего-то, что затрагивает все ветви sub_X, вам нужно разработать это исправление в main, так как main является общим предком всех ветвей sub_X. OTOH, если у вас есть что-то особенное для sub_23, правильно разработать материал для ветки sub_23.