Нужно ли мне объединять и фиксировать каждый раз, когда я обновляю свою ветку Mercurial на рабочем сервере? - PullRequest
2 голосов
/ 02 декабря 2009

Я использую Mercurial в недавнем проекте. На веб-сервере, на котором я развертываю проект, у меня есть немного другой файл конфигурации с настройками производства. Проблема в том, что когда я pull и update, мне часто приходится merge и commit.

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

Ответы [ 2 ]

5 голосов
/ 02 декабря 2009

Один из вариантов заключается в том, чтобы полностью исключить параметры развертывания сервера из репозитория управления версиями.

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

Например, когда я работаю с приложением Django, я регистрирую файл settings.py, который содержит:

  • Все настройки, которые не будут различаться на разных серверах (имя сайта, установленные приложения Django и т. Д.).
  • «Специфичные для сервера» настройки (расположение базы данных и т. Д.) Для локальной разработки.
  • Строка from deploy import * в конце.

Строка from deploy import * включает все элементы в файле deploy.py, если таковые существуют. На тестовом / промежуточном / производственном сервере я создам этот файл и помещу в него параметры, специфичные для сервера. Поскольку импорт происходит в конце settings.py, они перезаписывают любые параметры, относящиеся к локальной разработке, в основном файле настроек.

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

Эта конкретная схема предназначена для проекта Django, но, возможно, аналогичная идея подойдет вам.

4 голосов
/ 02 декабря 2009

Это как бы обрабатывается в этом вопросе , но я думаю, что ваш вопрос лучше, потому что он ищет немного большей ясности.

Короче говоря: Да, это нормально. Вот немного расширения:

Вы начинаете с этого в главном репозитории (где блоки представляют собой наборы изменений):

main: --[E]--[F]--[G]

затем вы клонируете на рабочий сервер и добавляете набор изменений H, который выполняет настройку развертывания. Таким образом, репозиторий развертывания выглядит так:

production: --[E]--[F]--[G]--[H]

, а затем в главном репо происходит больше работы, добавляются ревизии, I и J, и основной репо выглядит следующим образом:

main: --[E]--[F]--[G]--[I]--[J]

который при извлечении в производство выглядит так:

production:  --[E]--[F]--[G]--[I]--[J]
                            \         
                             \-[H]

с двумя головами, которые вы объединяете, чтобы получить:

production:  --[E]--[F]--[G]--[I]--[J]
                            \         \
                             \-[H]-----[K]

где K - это просто J плюс изменения, которые вы изначально сделали в H.

Теперь в основном происходит больше работы, давая:

main: --[E]--[F]--[G]--[I]--[J]--[L]--[M]

которые вы тянете в производственную подачу:

production:  --[E]--[F]--[G]--[I]--[J]--[L]--[M]
                            \         \
                             \-[H]-----[K]

и затем вы сливаетесь и получаете:

production:  --[E]--[F]--[G]--[I]--[J]--[L]--[M]
                            \         \         \
                             \-[H]-----[K]-------[N]

Таким образом, каждый раз, когда вы вносите изменения из основного, вы выполняете одно слияние и создаете один новый набор изменений (на этот раз N).

Я думаю, что это нормально, и это "нормально".

Однако вы можете избежать этого, воспользовавшись некоторыми ответами в вопросе, с которым я связан выше и есть новый прием, который можно использовать, чтобы изменил исходных родителей H. (и содержание), чтобы он всегда перемещался в конец нового совета.

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

Другими ответами были ртутные очереди и , позволяющие вносить производственные изменения в живое хранилище dev и запускаться чем-то другим в производственной среде (например, заголовок Host:).

...