Стоит ли беспокоиться о ветвях SVN, если они у вас есть?

10

Если мы будем работать только с одной веткой в ​​Subversion, стоит ли вообще беспокоиться? Разве мы не можем просто работать над стволом, чтобы ускорить процесс?

Вот как мы развиваемся с Subversion:

  • Есть сундук
  • Мы делаем новую ветку разработки
  • Мы разрабатываем новую функцию в этой отрасли
  • Когда функция завершена, она объединяется в ствол, ветка удаляется, и из ствола создается новая ветвь разработки.

Когда мы хотим выпустить в производство, мы делаем тег из ствола. Исправления сделаны на ветке из этого тега. Это исправление затем сливается в ствол.

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

Ниже приведена схема, которая должна уточнить:

Наша стратегия Subversion

Теперь есть ощущение, что это не самый эффективный способ работы. Мы строим локально, прежде чем совершить коммит, что занимает около 5-10 минут. Вы можете понять, что это довольно длительное время ожидания.

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

Затем, когда функция 1 завершена, она объединяется в транк, но с некоторыми фиксациями функции 2.

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

Что вы думаете? Можем ли мы просто работать на стволе? В худшем случае (я думаю) нам нужно сделать тег из ствола и выбрать нужные нам коммиты, потому что некоторые коммиты / функции еще не готовы к производству.

Питер
источник
1
Я думаю, что было бы лучше, если бы у вас было более одной ветви. Один для каждой функции. Таким образом, если вы когда-нибудь начнете работать с большой функцией, которая займет немного времени, вы не будете исправлять ошибки и тому подобное для уже выпущенных версий.
Эми Анушевски
Кажется, ветвь для каждой функции усложняет ее, а мы пытаемся уменьшить ее сложность. Также, если есть исправление (то есть для 1.0), это может быть сделано на ветке, сделанной из тега. Затем мы можем пометить эту ветку (сделать 1.1), выпустить ее и объединить исправление в ствол. Разработка крупной функции будет продолжена на стволе.
Питер

Ответы:

6

ИМХО работать напрямую с транком - это хорошо, если вы можете фиксировать с небольшими приращениями и у вас есть постоянная интеграция, чтобы вы могли (в разумной степени) гарантировать, что ваши коммиты не нарушат существующую функциональность. Мы делаем это и в нашем текущем проекте (на самом деле я не работал ни в одном проекте, использующем ветви задач по умолчанию).

Мы создаем ветку только перед выпуском, или если функция занимает много времени для реализации (т.е. охватывает несколько итераций / выпусков). Примерный размер задачи почти всегда можно оценить достаточно хорошо, чтобы мы заранее знали, нужна ли нам для нее отдельная ветвь. Мы также знаем, сколько времени осталось до следующего выпуска (мы публикуем выпуски примерно каждые 2 месяца), поэтому легко понять, подходит ли задание времени, доступному до следующего выпуска. Если вы сомневаетесь, мы откладываем это до тех пор, пока не будет создана ветвь релиза, тогда можно начинать работать над этим в транке. До сих пор нам нужно было создавать ветку для конкретной задачи только один раз (примерно через 3 года). Конечно, ваш проект может отличаться.

Петер Тёрёк
источник
1
Я с Питером. У нас есть ветка для каждого поддерживаемого выпуска, но в остальном работа в транке. Мы также используем непрерывную интеграцию, но имейте в виду, что это означает только то, что он будет компилироваться, а не то, что он не нарушил существующую функциональность, даже при модульных тестах.
Ян
@Ian, конечно, ни один тест в реальной жизни не может гарантировать, что код на 100% не содержит ошибок ... имея ограниченные ресурсы, мы стремимся к разумному уровню безопасности (определение которого зависит от домена и проекта). Также обратите внимание, что CI может запускать тесты интеграции и т. Д., А не только модульные тесты.
Петер Тёрёк
Это работает, пока не выйдет из строя. Если вам нужно внедрить исправление до того, как новая функция будет готова ... Или если новая версия функции не была готова к прайм-тайму, как вы думали, будет намного труднее поддержать это изменение в коде, если вы не используете ветвление.
SoylentGray
@ Чед, патчи к последнему выпуску делаются в соответствующей ветке релиза, без вмешательства со стороны транка. И мы тестируем новые функции довольно широко, поэтому мы знаем, когда они готовы к прайм-тайм. Конечно, у нас относительно мало крупных функций в нашем проекте. А поскольку это веб-приложение на стороне сервера, довольно просто даже добавить флаг БД для выборочного включения / выключения функций. YMMV.
Петер Тёрёк
LOL хорошо, я неправильно понял и подумал, что у вас есть транк (за одним исключением). Я использовал этот метод, и он отлично подходит для небольшой группы и частых небольших выпусков, он не работал для нас, выполняя большие выпуски на регулярной основе (3-6 месяцев). ) Интервалы.
SoylentGray
1

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

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

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

Джереми
источник
Я согласен, и ОП подтвердил это: «Иногда функция почти готова, и некоторые разработчики уже начнут кодировать следующую функцию ...»
Крис
Да, но мы никогда не должны перекомпоновывать. Функции реализованы в хронологическом порядке, и, например, функции 1-4 все должны быть в следующем выпуске (скажем, 1.0). Единственный случай, когда это может быть проблематично, - это когда начинается разработка функции 5, которая будет выпущена после этого (2.0). Затем мы должны убедиться, что эти изменения не включены в тег / release (1.0). Создание ветки до релиза действительно может это исправить.
Питер