Конфигурации, зависящие от машины управления версиями

#git #mercurial #github #bitbucket

#git #переменчивый #github #bitbucket

Вопрос:

Я хочу работать из нескольких мест, например, на веб-сайте. У каждого компьютера есть свой собственный репозиторий проекта (предпочтительно Mercurial, иначе Git), но каждому компьютеру нужны свои собственные настройки конфигурации для локального тестирования, например base_url . Каков наилучший способ управления версиями этого конфигурационного файла, который также будет включать глобальные настройки конфигурации?

Сведения о репозитории:

  1. Репозиторий на BitBucket с config.php : глобальная конфигурация конфигурация для текущего сервера
  2. Репозиторий pc A с config.php : глобальная конфигурация конфигурация, специфичная для ПК A
  3. Репозиторий pc B с config.php : глобальная конфигурация конфигурация, специфичная для ПК B

Когда я проверяю репозиторий BitBucket, я получаю полную конфигурацию сервера в реальном времени. Если мне нужно внести коррективы и протестировать его локально, я меняю текущие настройки на настройки, зависящие от ПК. Затем исправьте ошибку или что-то еще, зафиксируйте и отправьте в BitBucket. В этот момент настройки, зависящие от ПК, будут перенесены в глобальное репозиторий BitBucket: не то, что я хочу.

Итак, каков наилучший способ сделать это правильно?

Ответ №1:

Что вам нужно, так это скрипт smudge clean, который изменяет конфигурацию в зависимости от того, на какой машине вы находитесь.

https://git-scm.com/docs/gitattributes

https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion

Если вы хотите отслеживать конфигурацию каждого компьютера в отдельной ветке, внесите изменения в конфигурацию, затем объедините ваши изменения в ветку, которую вы предоставили в common remote, но игнорируете ваши изменения

 git merge --no-ff -s ours yourbranch
  

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

Надеюсь, это поможет.

Комментарии:

1. это чрезвычайно полезно, особенно progit.org/book/ch7-2.html#merge_strategies

Ответ №2:

Я не очень знаком с php, но я предполагаю, что у вас мог бы быть глобальный config.php файл, который мог бы включать (требовать?) config.<hostname>.php Файлы. Таким образом, все конфигурационные файлы находились бы под контролем версий, но конфликтов не было бы. В PHP должен быть какой-то способ определения имени хоста текущей машины и последующей загрузки соответствующего конфигурационного файла.

Результирующий макет репозитория может выглядеть следующим образом

 /
/config.php
/config.web_server.php
/config.pc_A.php
/config.pc_B.php
  

Комментарии:

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

2. В таком случае, почему бы не использовать ветку для каждой машины? git cherry-pick позволяет извлекать определенные коммиты из других ветвей / удаленных устройств. Я уверен, что у mercurial есть похожая команда, хотя я не использовал ее достаточно, чтобы знать, что это такое.

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

4. На самом деле, будет ли работать что-то вроде Git rebase? Переход -> Первая фиксация будет зависеть от ПК -> перебазирование -> фиксация, как обычно

5. Совсем не плохое решение. Вы могли бы config.php в отдельных ветвях для ваших компьютеров, и когда вы хотите что-то исправить, создайте новую ветку, а затем перенесите свои исправления, например, в master и push up master.

Ответ №3:

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

Комментарии:

1. Вы имеете в виду разделение глобальной конфигурации и конфигурации, зависящей от компьютера, в разных файлах, как предложил Эрик? Возможно, но не идеально (разные конфигурационные файлы на реальном сервере, которые не нужны). Спасибо за ответ!