Ветвь, ориентированная на разработчика в SVN - PullRequest
4 голосов
/ 27 февраля 2012

Нашу команду просят перейти с CVS на SVN, и хотя это не совсем Mercurial или Git, на которые я надеялся, это по крайней мере шаг в правильном направлении.

Я знаю, что большое зависание для команд разработчиков - по крайней мере с SVN (или любым другим SCM, ориентированным на ветви) - это тема ветвления и слияния.

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

Я возился с мыслью о том, чтобы разработчики извлекали из транка / но у каждого были свои (индивидуальные) ветки разработчика и добавляли новый код в эти ветки. Затем, когда разработчик заканчивает свою работу, мы просто объединяем код, относящийся к этой работе (расположенный внутри собственной «частной» ветви), с trunk. Таким образом, они больше никого не держат, и если они отстанут, они не остановят релиз.

Просто интересно, что думали SO о ветвлении, ориентированном на разработчика. Если это ужасная идея, почему? Какой подход лучше? Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

CollabNet, Inc., первоначальный спонсор Subversion, составил список Передовых практик Subversion .

Последний раздел списка - «Знай, когда создавать ветви».

Филиалы зависят от культуры вашего программного проекта. CollabNet описывает три распространенные системы филиалов.

  • Система никогда не ветвится
  • Система с постоянным ветвлением
  • Система ветвления, когда это необходимо

Система Never-Branch используется в новых проектах без исполняемого кода. Может также использоваться сольными разработчиками.

Система Always-Branch часто используется в проектах, которые способствуют интенсивному управлению и надзору.

Каждый разработчик создает / работает в частной ветке для каждой задачи кодирования. Когда кодирование завершено, кто-то или что-то просматривает все изменения в частной ветке и объединяет их в /trunk.

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

Система Branch-When-Needed - это система, используемая самим проектом Subversion. Это система, которая имеет смысл, когда группа разработчиков выпускает свой продукт с помощью версий.

Пользователи фиксируют свою повседневную работу над / trunk. Пользователи не фиксируют, пока после модульного тестирования. / Транк периодически проходит регрессионное тестирование.

Время от времени ствол привязывается к конкретному выпуску или версии продукта. Если в предыдущей версии продукта обнаружена ошибка, из тега версии создается ветка для устранения проблемы. Это исправление затем объединяется с /trunk.

2 голосов
/ 27 февраля 2012

Я один из тех, кто думает, что функциональные ветви - это зло.Проверьте этот связанный вопрос для некоторого обсуждения этой темы (включая ответ самостоятельно): Совместимо ли использование «ветвей функций» с рефакторингом?

Мне не нравится ветвление функций, потому что этобросает вызов центральной цели непрерывной интеграции ( практика , а не инструмент ), которая заключается в том, чтобы разработчики интегрировали свою работу рано и частов процессе разработки, и эта интегрированная работа была подтверждена автоматизированным процессом сборки.Приняв рабочий процесс ветвления на разработчика, вы по своей конструкции сделали эту практику невозможной, и вы вернулись к разработчикам, которые вносят независимые, непроверенные изменения, которые затем необходимо объединить вместе в «большое слияние» в конце разработки.process.

Помощники DVCS скажут, что это чисто проблема набора инструментов.Теперь я согласен с тем, что существуют системы контроля версий, которые обрабатывают ветвления и слияния гораздо лучше, чем Subversion.Такие системы, безусловно, подходят для децентрализованных проектов с открытым исходным кодом, для которых они были разработаны.Однако, даже если объединение было тривиально простым (что никогда не может быть, даже с идеальными инструментами), у вас все еще есть проблема задержка интеграции до поздней стадии процесса.Это может быть желательно в проекте с открытым исходным кодом, где есть только несколько доверенных привратников к магистрали и много (менее заслуживающих доверия) соавторов.Тем не менее, в коммерческой команде вы действительно должны быть в состоянии доверять всем, кто берет на себя обязательства по транку, и, следовательно, не должно быть необходимости в привратниках.

В заключение, вот мои ответы на ваши смелые вопросы:

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

Какой подход лучше? В моей организации все разработчики регистрируются непосредственно в транке.У нас есть непрерывные сборки (вне магистрали) для каждого приложения, и мы регулярно (каждую неделю или две) сокращаем новую ветку выпуска (и создаем выделенную сборку для каждой ветки выпуска).Вместо того чтобы создавать ветви функций, мы стараемся создавать новые реализации наших интерфейсов для реализации новых или значительно измененных функциональных возможностей.Эти новые реализации могут оставаться неиспользованными в производстве до тех пор, пока они не будут готовы, и тогда мы сможем переключить наши приложения на их использование.Использование контейнера IoC делает этот процесс очень простым.

1 голос
/ 28 февраля 2012

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

Есть три основные причины, по которым вам нужно ветвиться:

  1. У вас есть несколько версий вашего продукта, и более старая версия имеет дефект. В этом случае вы создаете ветку с более старой версией и фиксируете ее на ветке. В противном случае вы должны включить весь новый код, который вы добавили с момента выпуска.

  2. У вас есть несколько десятков программистов, работающих над проектом в Выпуске 1.0. Когда проект приближается к точке релиза, вы хотите прекратить добавлять функции и исправлять ошибки. Тем не менее, это оставляет большинству ваших программистов нечем заняться, кроме как крутить пальцы, в то время как два или три программиста, ответственные за выпуск, работают над завершением выпуска. Там просто не хватает работы для всех. В этом случае вы ветвите Выпуск 1.0 и делаете свой выпуск вне ветви. Тем временем остальные разработчики могут продолжить работу над выпуском 2.0. \

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

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


Вопрос в том, почему Дело № 3 намного сложнее, чем в двух других случаях. Ответ заключается в том, расходятся ли ветви друг от друга или сходятся друг к другу. В случае № 1 и № 2 ветви расходятся. В случае № 2 код версии 1.0 будет отличаться от кода версии 2.0, а код версии 1.0 будет еще более отличаться от кода версии 3.0. Фактически, когда-нибудь в будущем код в ветке Release 1.0 будет неактуальным.

Между тем, в случае № 3 ветви сильно сходятся друг с другом. Это означает, что вы должны держать их в синхронизации. Это требует усилий и контроля. Требуется много энергии, чтобы убедиться, что ответвления, которые в конечном итоге должны объединиться, должны оставаться синхронизированными.

Именно поэтому большинство сайтов теперь делают ветвления, когда это необходимо, и не используют старую систему функций или ветвей разработки. Это добавляет много сложности. Каждое отделение должно быть управляемым, и каждое объединение должно быть тщательно рассмотрено.


Кстати, это одна из причин того, что распределенные системы контроля версий не всегда лучше, чем централизованные. Я видел слишком много мест, где использовался Git, и тогда все разработчики работали над своим небольшим репозиторием и никогда не разговаривали друг с другом. За неделю до релиза мы получили десятки патчей, а затем поспешили объединить весь код в готовую версию.

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

...