Конфигурации конкретной машины для управления версиями

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

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

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

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

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


person floorish    schedule 25.04.2011    source источник


Ответы (3)


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

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

/
/config.php
/config.web_server.php
/config.pc_A.php
/config.pc_B.php
person Eric Seidel    schedule 25.04.2011
comment
Возможное решение, да, но я действительно не хочу, чтобы config.pc_A.php плавал на моем Live-сервере. Я знаю, что мог бы удалить его просто так, но, может быть, есть что-то получше. Спасибо, в любом случае - person floorish; 25.04.2011
comment
В таком случае, почему бы не использовать ветку для каждой машины? git cherry-pick позволяет вам получать определенные коммиты из других веток/удаленных серверов. Я уверен, что у mercurial есть аналогичная команда, хотя я не использовал ее достаточно, чтобы знать, что это такое. - person Eric Seidel; 25.04.2011
comment
Хорошо, рассмотрим это. Это будет немного сложнее (нужно отслеживать новые коммиты), но, по крайней мере, хорошая чистая среда. Спасибо еще раз - person floorish; 25.04.2011
comment
На самом деле, будет ли работать что-то вроде Git rebase? Ветвь -> Первая фиксация будет специфичной для ПК -> перезагрузка -> фиксация как обычно - person floorish; 25.04.2011
comment
Совсем не плохое решение. У вас может быть config.php в отдельных ветках для ваших ПК, и когда вы хотите что-то исправить, создайте новую ветку, а затем перебазируйте свои исправления, например. мастер и мастер отжиманий. - person ralphtheninja; 25.04.2011

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

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

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

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

git merge --no-ff -s ours yourbranch

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

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

person Adam Dymitruk    schedule 25.04.2011
comment
это чрезвычайно полезно, особенно progit.org/book/ch7-2.html#merge_strategies< /а> - person w43L; 04.05.2011

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

person ralphtheninja    schedule 25.04.2011
comment
Вы имеете в виду разделение глобальной конфигурации и конкретной машины в разных файлах, как предложил Эрик? Возможно, но не идеально (разные конфигурационные файлы на действующем сервере, которые не нужны). Спасибо за ответ! - person floorish; 25.04.2011