Примечание: мой вопрос сосредоточен на моей конкретной проблеме (которая включает в себя Liferay), но я надеюсь, что это может быть полезно для всех, кому нужно поддерживать различные версии одного и того же проекта в git.
Я работаю в компании, которая пишет много плагинов для Liferay Portal . Эти плагины (портлеты, темы и т. Д.), Как правило, могут быть использованы повторно и, конечно, должны быть обновлены для новых версий портала.
Однако обычно приходится переносить, скажем, портлет в новую версию Liferay и поддерживать его предыдущую версию. Кроме того, часто нам приходится создавать очень специфические настройки для некоторых клиентов, которые не имеют смысла добавлять в «основную версию».
Эти реквизиты усложняют нашу работу, но, к счастью, мы можем предположить некоторые упрощения. Например, плагины часто обновляются только одним программистом за раз. Очень редко две или более функций добавляются в плагин одновременно.
Теперь мы мигрируем в Gitorious . Мы пытаемся создать модель ветвления для такого сценария.
Моя модель
Я предложил следующее:
- Каждый плагин будет иметь свой собственный репозиторий в Gitorious внутри проекта. Например, портлет для отображения котят будет иметь
kittens-portlet
репозиторий внутриliferay-portlets
проекта. - При создании нового плагина создайте его в ветке с именем в соответствии с версией Liferay (например,
lf5.2
). - Каждый раз, когда производится обновление плагина, оно утверждается и развертывается в рабочей среде, пометьте плагин версией (например,
lf5.2v1
иlf5.2v2
т. Д.) * - Каждый раз, когда плагин должен быть портирован на новую версию Liferay, мы разветвляем самую последнюю версию (создавая, например, ветку
lf6.0
). - После запуска руководитель нового филиала получит такой тег, как
lf6.0v1
. - Каждый раз, когда нам нужно настроить плагин для конкретного клиента, мы создаем ветку с именем клиента (например, мы создаем ветку
lf5.2clientcorp
для нашего клиента "ClientCorp Inc.")
Это необычная модель: в ней не было бы master
и много не сливающихся веток. Вот как я думаю, что репозиторий с такой моделью будет выглядеть так:
Друг нашел эту систему довольно сложной и подверженной ошибкам. Он предложил отличную и популярную модель Винсента Дриссена , которую я нашел еще труднее управлять и дисциплинировал. Это здорово (и проверено!) Конечно, но кажется слишком сложным в нашей ситуации.
Модель моего друга
Затем он предложил другую модель: у нас будет хранилище для каждого плагина в версии Liferay (поэтому мы начнем создавать a, kittens-lf5.2-portlet
а затем a kittens-lf6.0-portlet
), каждый с master
ветвью и develop
ветвью. master
Будет всегда готов к развертыванию. (Или это может быть наоборот, master
и stable
, как предполагает Стив Лош ).
Это очень просто, но мне не понравилась эта система:
- это может привести к огромному количеству репозиториев в проекте, что затруднит просмотр Gitorious.
- Название каталога проекта актуально. Если кто-то клонирует репозиторий в
kittens-lf6.0-portlet
dir и сгенерирует WAR с помощью ant (как обычно), то будетkittens-lf6.0-portlet
также указано имя WAR . Старые версии этого портлета (названные,kittens-portlet
например) будут рассматриваться как разные (и, вероятно, отсутствующие) портлеты в обновленном портале. Осторожности можно избежать, но я бы предпочел этого избежать. - Различные версии одного и того же плагина будут поддерживаться отдельно. Я разбиваю свое сердце :(
kittens-lf6.0-portlet
я думаю, это уродливое имя для хранилища.
Я подозреваю, что два последних пункта, а также два более субъективных, являются основной причиной моего нежелания. Тем не менее все четыре возражения остаются в силе.
ОТО, мое собственное предложение кажется мне странным, и мне интересно, есть ли в нем скрытые ошибки. OT3rdH git настолько мощен и гибок, что, думаю, мне не стыдно исследовать его возможности.
Итак, я спрашиваю:
- Какой будет лучшая модель? Мое предложение? Модель моего друга? Теперь традиционная система Винсента Дриссена?
- Какую другую модель ветвления вы бы предложили?
- Если вы думаете, что моя модель плохая, почему вы так думаете? Я хотел бы узнать, каковы недостатки и слепые пятна.
* На самом деле, я бы предпочел пометить коммит такой версией, как, v1
но, очевидно, тэг в git не ограничен в ветке - то есть я не мог иметь 1 v1
тэг lf5.2
и еще один lf6.0
- поэтому я должен назвать ветвь. Это правильно, кстати?