2015-04-24 2 views
0

Я начал работать в небольшой (4 разработчиках) компании.Рабочий процесс Git для давно открытых ветвей

Наша ситуация:

Перед тем как я начал здесь работать, они использовали диверсия. Никто не имел глубоких знаний об управлении источниками. Поэтому никогда не было понятия о том, как работать с контролем источника. У них было много проблем с подрывной деятельностью, поэтому я перевел наш источник в Git. Теперь мы работаем с Гит. Продукт, который мы разрабатываем, состоит из множества приложений (служб Windows, веб-сервисов, веб-приложений, настольных приложений, баз данных, скриптов ...). (Большинство из них созданы с помощью Microsoft .Net Technology или C++.) Почти каждое приложение общается с другими приложениями или использует одну и ту же базу данных (поэтому внесение изменений в одно из приложений часто означает, что мы должны изменить другие приложения). Мы стараемся сделать как можно меньше зависимостей, но большинство из них невозможно избежать. Мы разрабатываем эти приложения для разных клиентов. Установка нашего программного обеспечения довольно проста и быстро ... но наши клиенты (и компании, на которых работают серверы) имеют множество политик (вместо этого они должны тестировать каждое новое или измененное приложение, которое может занять до 1 месяца), что сделайте установку очень долгим процессом. К сожалению, мы ничего не можем с этим поделать.

Теперь наша задача:

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

 master 
     | 
     | 
     \ 
     |\ 
     | installationCustomer1 
     |  | 
     |  | (implementing new features) 
     |  | (delete branch after about 3 years) 
     | 
     \ 
     |\ 
     | installationCustomer2 
     |  | 
     |  | (implementing new features) 

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

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

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

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

ответ

0

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

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

Это не всегда так. В зависимости от вашей модели разработки вам могут понадобиться ветви, такие как master, develop, release, но в конце все коммиты должны быть либо отброшены, либо объединены с багажником.

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

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

+0

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

+0

И эти новые функции, разве они не будут в конечном итоге объединены? – Gauthier

+0

Будет объединен с мастером, но мы все равно должны держать ветвь установки открытой для следующей функции, которую запрашивает клиент. – musium

Смежные вопросы