Как запретить Git объединять определенные ветки
Мне нужна поддержка 3 версий моей программы. Где большинство файлов
Совместное (общее), но несколько файлов содержат разный контент для каждой версии.
Я, вероятно, буду использовать 4 ветви A,B,C,D в Git.
Форма примера проекта Мороженое:
____________________________________________________
Cup.txt: { Waffle cup } – common file for all version
Filling.txt { banana } - special file for B version
Filling.txt { strawberries } - special file for C version
Filling.txt { vanilla } - special file for D version
____________________________________________________
A - ветка, подходящая только для глобальных файлов (Cup.txt)
B, C, D - ветка подходит только для файла Filling.txt.
Для этой стратегии мне нужно разрешить слияние только в одном направлении: A => B,C,D
Мой вопрос - как запретить слияние веток B, C, D с A в Git?
2 ответа
Что касается исходного кода, лучше всего избегать сложной стратегии слияния и изменять PrintBill для того, чтобы:
- отдельный контент, специфичный для клиента A и B
- создать правильный исполняемый файл для клиента A и клиента B, выбрав правильный источник
Идея та же, что и изначально написанная ниже: избегайте любой сложной стратегии слияния.
Теперь, если такой рефакторинг невозможен, вы можете попытаться объявить драйвер слияния, но это не всегда будет вызываться (только в случае конфликтов).
Другой подход заключается в том, чтобы избежать версий Filling.txt
(таким образом, больше нет головной боли стратегии слияния).
Вы можете:
- версия 3 разных файла со значениями для каждой среды
- настроить
smudge
скрипт ( драйвер фильтра содержимого объявляется в.gitattributes
файл), который автоматически при оформлении заказа генерирует, в зависимости от извлеченной ветви, правоFilling.txt
Во-первых, я не думаю, что это действительно то, что вы хотите сделать.
Вы хотите запретить слияние B-специфичных вещей в A.
Но слияние общих исправлений ошибок из B в A должно быть хорошо.
Таким образом, вы должны хранить B-специфичные вещи в отдельных файлах.
В любом случае, вам нужно что-то вроде перехвата git pre-receive на "центральном сервере", который, я думаю, проверяет и предотвращает добавление "запрещенных файлов".
Но учтите, что если вы храните специфичные для B вещи в отдельных файлах, вам даже не нужно использовать git-ветки для решения этой проблемы. Вы можете просто использовать отдельные проекты с зависимостями между ними.