Pull to refresh

Хранение конфигов под версионным контролем

Reading time 2 min
Views 16K
Имеем следующую ситуацию:

В проекте присутствует файл super.config. В нем содержатся много разных настроек проекта. Например, конфигурация взаимодействия со сторонним сервисом и уровень логирования. Система контроля версий — git.

В чем проблема:

  1. Этот файл должен находиться под версионным контролем, так как в нем содержатся «общие» настройки. Ну и сама структура файла ценна.
  2. Каждый разработчик меняет уровень логирования под свои нужды и не хочет, чтобы эти изменения попадали в коммиты, и тем более в интеграционный репозиторий.
  3. В этом файле периодически меняются общие настройки, и разработчик хочет их получать (pull) и публиковать (commit)


Возможные решения:

  1. Хранить исходные тексты приложения и его настройку отдельно. Но жизнь боль, и не всегда это можно сделать. Причины на это разные: от технических до (некомпетентных людей) административных.
  2. Пошаманить с загрузкой конфигурации. Например, под версионным контролем хранить default.super.config, а super.config исключить. Приложение должно сначала грузить свойства из default.super.config, а потом, если он есть, из super.config. Причем значения из последнего перекрывают значения из дефолтного.
  3. Просто не добавлять изменения локального конфига в индекс.
    Плюсы:
    • Простота.
    • Если нужно закоммитить изменения в конфиге, то это делается по фрагментно (git add -p).

    Минусы:
    • Не сделаешь git add.
    • Постоянно «маячат» какие-то изменения. Разработчик каждый раз их анализирует, проверяя все ли закоммитил.
    • Переключение (checkout) на ветку с другим конфигом возможно только с ключом -m или через stash (ключ -f убивает изменения в рабочей копии).
    • Pull изменений конфига приводит к ошибке. Прежде чем получить изменения, локальные придется убрать на полку.

  4. Исключить конфиг из-под версионного контроля.
    Не сработает. Только untracked файлы можно исключать из-под версионного контроля.
  5. Убедить git, что файл конфига не меняется. Как это сделать:

    git update-index --assume-unchanged super.conf

    Плюсы:
    • git add . не добавит лишнего.
    • «Чистый» статус.

    Минусы:
    • Git не сможет переключиться на ветку с другим конфигом, получить или закоммитить изменения конфига. При этом сообщения в консоли могут вводить в заблуждение: git status пишет «nothing to commit, working directory clean», а git pull«Your local changes to the following files would…».
      Для того чтобы разрешить эту ситуацию, придется открыть git глаза обратной командой git update-index --no-assume-unchanged super.conf. И все равно, далее придется воспользоваться полкой.
    • Посмотреть, на что git закрывает глаза можно командой git ls-files -v | grep -e "^[hsmrck]" (не, ну все же понятно).


Как бы поступил я:

Если конфиг меняется крайне редко, то --assume-unchanged выглядит подходящим решением. Иначе просто не обращал бы внимания на изменения.

А вообще, надо хранить настройки отдельно.

Ресурсы по теме


Tags:
Hubs:
+2
Comments 10
Comments Comments 10

Articles