Контроль источника - Требуется ли отдельная ветка для каждого продукта? - PullRequest
6 голосов
/ 10 июля 2009

Допустим, у вас есть четыре продукта с собственным графиком выпуска. Каждый продукт имеет 50% общего кода (общая функциональность для всех продуктов) и 50% кода, специфичного для продукта.

Вам нужна отдельная ветка контроля версий для каждого продукта? Должны ли общие функции всегда развиваться в одной из четырех ветвей продуктов и объединяться с другими продуктами позже?

Типичный сценарий: продукт A будет выпущен в следующем месяце и требует основного (общего) расширения 1, продукт B будет выпущен через четыре месяца и требует основного (общего) улучшения 2 (для завершения которого потребуется три месяца). *

Ответы [ 8 ]

3 голосов
/ 10 июля 2009

Я храню общий код в его собственной папке продукта. Затем используйте svn: externals , чтобы поделиться кодом среди других продуктов. Немного больно обрабатывать ветвления и слияния, но это лучше, чем иметь четыре копии общего кода в хранилище. Примерно так (замените транк на /branches/RB-1.0.0 или /tags/REL-1.0.0 для веток релизов и помеченных релизов):

/core/trunk
/product_a/trunk
  /core (svn:externals 'core /core/trunk')
/product_b/trunk
  /core (svn:externals 'core /core/trunk')
/product_c/trunk
  /core (svn:externals 'core /core/trunk')
/product_d/trunk
  /core (svn:externals 'core /core/trunk')

UPDATE0 : обратите внимание, что /product_a/tags/REL-1.0.0 может использовать /core/tags/REL-1.0.0, в то время как /product_b/tags/REL-1.0.0 может использовать / core /tags/REL-1.1.0

2 голосов
/ 10 июля 2009

Общая функциональность может быть разработана в отдельной ветви платформы, где каждый продукт получает свою собственную ветку для разработки для конкретного продукта.

1 голос
/ 10 июля 2009

Ветвь в самой высокой точке вашего дерева. То есть, должен включать код для всех ваших проектов, общих модулей ... и, вероятно, такие вещи, как документация / сценарии сборки / установщики / и т. Д. Зачем? Почему бы и нет! Ветви дешевы во всех упомянутых системах (SVN, TFS, Perforce, git).

Эта тактика особенно важна в системах, в которых используется ветвление "путь к пространству" (TFS, Perforce). В противном случае создание полного комплекта продуктов, совместимого с рабочими пространствами разных людей, станет кошмаром обслуживания.

Как только вы примените это на практике, вы можете изменять столько или меньше кода, как вам нравится в данной ветке. Вы всегда можете сделать полную сборку для проверки проблем интеграции; Возможность объединения любого компонента (-ов) между любым набором ветвей остается для вас открытой. Но вопрос стратегии SDLC полностью ортогональн. Вы можете ветвиться за функцию, за команду, за выпуск или любую комбинацию вышеупомянутого; Вы можете определить критерии прямой / обратной интеграции по своему усмотрению. * Тот факт, что каждая ветвь является надмножеством, доказывает преимущество во многих стратегиях и никогда не должно быть оправданием, если ваши инструменты отвечают требованиям.

* Выбор стратегии - это отдельный вопрос, который зависит от множества факторов. Другие предложили некоторые хорошо известные документы, которые помогут вам принять решение. Я поместил бы самую последнюю версию руководства Microsoft TFS вместе с лучшими из них.

1 голос
/ 10 июля 2009

Вот IMO, одна из лучших статей, которые я читал о ветвлении: Ветвление и слияние перед лицом гибкой разработки, экстремального программирования, совместной работы команды и параллельных выпусков

Я думаю, что я бы хотел избежать объединения ветвей (и, следовательно, графика) двух проектов: и поэтому вместо одной ветви, в которой вы редактируете общую функциональность и редактируете более одного продукта, возможно, один из следующие две альтернативы:

1) Разработка общей функциональности независимо от какого-либо продукта

  • Общие функции филиала
  • Добавить к этому
  • Юнит-тест это
  • Зафиксируйте его обратно в основную линию
  • Создайте ветки для этого продукта (основная линия) и используйте их в продуктах

2) Разработка общей функциональности с одним продуктом

  • Создать продукт ветка
  • В ветке продукта добавьте новые функции в общую библиотеку, а также в компоненты для конкретного продукта
  • Проведите модульное тестирование, системное тестирование и отправьте его обратно в магистраль
  • Создайте ветки новой магистрали, в которой вы используете недавно использованные общие функции в других продуктах
1 голос
/ 10 июля 2009

Не прямой ответ на ваш вопрос, потому что я не уверен на 100%, что можно дать ответ «один размер подходит всем». Но Джефф написал превосходное сообщение в блоге о ветвлении .

0 голосов
/ 10 июля 2009

Мы создали серию сайтов, которые имеют общую базу и большое количество пользовательского кода, используя git, структурировав его как серию ветвей.

Основная ветвь содержала код ядра, и каждая ветвь этого мастера была определенной настройкой ядра. При внесении изменений в ядро ​​было легко протолкнуть их вниз к веткам, сохранив при этом каждую пользовательскую версию изолированной.

18 сайтов и 12-месячный проект с командой из 7 человек, и он все еще под контролем!

0 голосов
/ 10 июля 2009

У нас похожий сценарий. У нас есть общие библиотеки для ведения журнала, доступа к данным и безопасности, но эти библиотеки используются во многих проектах. Мы создаем отдельный набор веток для каждого продукта, а затем используем внешние ссылки SVN для связи с общими библиотеками. Таким образом, общие библиотеки поддерживаются в «общей» ветви для всех проектов, в то время как все проекты имеют независимые ветви.

Таким образом, мы можем обеспечить сборку всех продуктов на основе последней версии общих библиотек, в то время как проекты также могут обслуживаться независимо.

0 голосов
/ 10 июля 2009

Положите их все в одну ветку. Во время разработки вы хотите знать, нарушает ли изменение продукта A продукт B. Это гораздо лучше, чем попадать в беспорядок слияния, когда вы обнаружите, что ProductB пришлось переписать половину вашей общей кодовой базы, а остальные 3 зависят от того, как есть.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я имею в виду, они все должны иметь общую ветку разработки. Я бы посоветовал отдельную ветку Production для представления кода, находящегося в разработке, и ветку Maintenance, если вы регулярно выпускаете исправления ошибок.

...