2009-09-07 2 views
5

Я читал все вопросы здесь по теме контроля версий, но я не думаю, что нашел сценарий, похожий на мой собственный.Version control «best practice»

Сценарий:

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

В нашей нынешней ситуации мы используем CVS (с tortoiseCVS), и мы не используем ветки, мы используем теги, чтобы различать изменения кода приложения (да, я знаю, что это довольно плохо). Это приносит много проблем, когда мы хотим сделать релиз конкретному клиенту, а также внести изменения и т. Д. ... Для подготовки выпуска всегда требуется около 1-2 дней работы, а иногда все еще ломается.

Иногда запрос от клиента также включается в ядро ​​для распространения среди всех клиентов.

Итак, мой вопрос: являются ли ветви лучшим способом для изоляции изменений клиентских версий приложения? Должны ли мы разворачиваться каждый раз, когда новый клиент запрашивает настройку? Или мы должны рассматривать его как совершенно другой проект с другим хранилищем?

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

Благодарим за отзыв.

Антонио Диас

+0

Просто хочу сказать спасибо за все ответы. Даже если это не лучшая стратегия, я собираюсь попробовать стратегию «филиал для клиента». Каждый клиент получает свою собственную долговременную ветвь, и каждый из них получает свои «основные» и «девитовые» ветви. По крайней мере, я думаю, что это будет лучше, чем у нас сейчас. Спасибо всем. –

ответ

4

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

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

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

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

+3

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

0

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

cvs tag -r MY_TAG -b MY_BRANCH 

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

Эти филиалы должны быть выполнены для каждого цикла UAT (пользовательского теста), начиная с вашей текущей разработки.После этого вы можете:

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

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

4

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

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

Все будет еще хуже, если вы продолжите эту стратегию «один на один клиент» при добавлении новых клиентов.

+0

Да, но это «старое» приложение (html/asp/vb6), и теперь невозможно реорганизовать «вещь». изменение может быть просто набором настраиваемых страниц (например, разных изображений или текстовых меток или что-то «тривиальное»). Как сохранить стандартную версию и эту новую версию в системе управления версиями? –

+0

Я отвечал за очень большое приложение, основанное на VB6, и был очень настраиваемым. В этой технологии ничего нет, что делает невозможным рефакторинг, хотя я понимаю, что у вас, вероятно, есть очень большая база кода, с которой можно справиться. Вам нужно будет честно оценить, является ли (высокая) стоимость рефакторинга (с уделением особого внимания областям, где у вас больше всего настроек) больше, чем высокая стоимость не рефакторинга. Только вы знаете свое приложение. Просто будьте честны в отношении истинной стоимости каждой альтернативы. –

+0

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

3

Насколько я знаю, то, что вы делали, - это не то, что должно выполнять управление версиями. Он используется только для отслеживания исходного кода, а не для вашего распределенного продукта. На ваш вопрос о филиалах я думаю, что это небольшое объяснение может помочь: - магистраль является основной разработкой проекта, здесь сотрудничают все члены команды. - филиал - это место для временного развития (да, вы слышали это правильно). Здесь вы можете делать эксперименты или вмешиваться в код, не затрагивая других членов команды. - тег - это ничего, кроме «named snapshot». В моментальных снимках проекта управления версиями везде, тег - это способ, которым вы можете дать им более читаемое имя. Если вы попытаетесь получить все больше и больше филиалов без их распоряжения, ваш проект будет расти и расти навсегда. Я все еще удивляюсь, почему вы все равно должны отслеживать все это. Могу ли я повторить еще раз, контроль версий предназначен только для взаимодействия только с исходным кодом, а не для распространения среди нескольких клиентов. Надеюсь, что помощь

+0

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

+0

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

1

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

Я работал над проектом, где они пытались управлять версиями так, как вы описали, с помощью тегов. Это была чья-то работа, чтобы вручную добавлять/объединять изменения с тегом, а затем применять новый тег. Это очень тяжело для всех, чтобы оставаться в синхронизации и почти всегда приводит к нарушению сборки из-за простых ошибок (забытые файлы, топание изменений и т. Д.). Вы в основном вручную делаете то, что для вас делают филиалы.

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

Возможно ли разрывать компоненты и иметь подпроекты? Некоторые из основных областей могут не изменяться часто и могут быть добавлены в сборку (вроде как сторонние банки).

Или у вас может быть ваша базовая сборка/установка, а затем слой на настройках. Наложение пользовательских файлов и/или изменение базовых файлов.

2
Feature Branching is a poor man's modular architecture, instead of building systems with the ability to easy swap in and out features at runtime/deploytime they couple themselves to the source control providing this mechanism through manual merging. 

--Dan Bodart - через Martin Fowler

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

+1

«[U] петь, если утверждения вместо ветвей ... это работа вокруг [для] того факта, что ваш инструмент управления версиями не делает то, что он должен делать». - Joel Spolsky http://www.joelonsoftware.com/items/2010/03/17.html – jammycakes

+0

Да: но это, кажется, пример противоположного случая. Или вы считаете, что все операторы if в исходном коде должны быть заменены ветвями? – soru

+0

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