2016-11-30 10 views
0

В разумном «объединении только для мастеринга» git workflow (например, gitflow) - все изменения происходят в ветвях, которые в свою очередь объединяются (возможно, как часть запроса Pull) - как мне обрабатывать управление версиями?Как объединить управление версиями с merge-only для управления потоком git?

Для пометки, я легко могу git tag конкретного слияния, не имеет большого значения.

Но многие фреймворки приложений полагаются на файл версии (например, package.json или gemspec или даже пользовательские файлы).

Я вижу несколько вариантов:

  1. Измените файл как часть отрасли. Это не очень хорошо, так как вы редко знаете заранее, какая версия сначала будет объединена, особенно с большой командой со многими филиалами, работающими параллельно.
  2. Изменить файл после совершить. Это не очень удобно, так как я теперь поручаю освоить, и b-automatic CI/CD захватит предыдущую фиксацию и отпустит ее, но у нее есть старая версия и c- с 2 коммитами для овладения одной версией, можно проверить неправильную версию; легкая человеческая ошибка.
  3. Сделайте файл версии шаблоном и автоматически сгенерируйте его из тега git. Это тоже не здорово, так как локальная оснастка будет ломаться на нем (попробуйте запустить npm <anything> с недопустимым package.json), и репо больше не может само стоять как атомный блок.

Есть ли стандартный способ сделать это, когда управление версиями находится в файле, который является частью коммита?

ответ

1

Вы можете использовать стратегию, согласно которой люди могут вносить вклад в мастер-ветвь только слиянием, и только автоматизированный CI/CD (например, Jenkins) может изменять содержимое файла версии непосредственно в master. Автоматизированная релиза процесс с CI/CD точки зрения может выглядеть следующим образом:

  1. тянуть мастер (мастер кода замораживание начинается)
  2. запустить предварительно релиз сборки (со старой версией)
  3. содержания приращения файла ver и фиксации
  4. запустить выпускную версию с новой версией выпуска (отличается от # 2 по содержанию файла ver)
  5. push master to central repo (возможно, с --force, если сом eone нарушил мастер заморозки коды)

В дополнении, вы можете защитить версии файла от изменения слияния-к-мастеру с .gitattributes в каталоге файлов вер с содержанием verfile merge=ours (см here)

+0

Большая часть этого у меня есть, спасибо @IrLED. Ключ к вашему предложению состоит в том, чтобы файл версий был изменен только CI/CD?Проблема в том, что там часто гораздо больше, чем просто версия. Подумайте «package.json» или «Gemfile». Многое из этого законно необходимо изменить во время нормального процесса dev; требуется только одно поле. – deitch

+0

> Ключ к вашему предложению состоит в том, чтобы файл версий был изменен только CI/CD? Да, в этом суть. Чтобы отделить защищенную часть от общедоступной, вы можете выполнить некоторую предварительную обработку 'package.json' - вставить значение из файла ver. – IrLED

+0

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

1

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

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

+0

Подобно подходу @ IrLED, с помощью специального инструмента, спасибо. Думаю, я попробую сочетание двух. – deitch