Подтвердить что ты не робот

Mercurial: сохранить две ветки в синхронизации, но с некоторыми постоянными различиями?

Я - веб-разработчик, работающий самостоятельно, используя django, и я пытаюсь разгадать, как лучше всего развертывать сайты, используя меркурий. Я хотел бы иметь возможность хранить один репозиторий, который я могу использовать для производства и разработки. Между производством и развитием всегда будут какие-то различия (например, они могут использовать разные базы данных, при разработке всегда будет включен отладка), но по большому счету они будут синхронизироваться. Я также хотел бы иметь возможность вносить изменения непосредственно на производственный сервер (убирать html или css, простые исправления и т.д.).

Рабочий процесс, который я намерен использовать для этого, выглядит следующим образом:

  • Создайте 2 ветки, prod и dev (все настройки изначально настроены на производственные настройки)
  • Измените settings.py и еще несколько вещей в ветке dev. Итак, теперь у меня есть 2 головы, и теперь у репозитория всегда будет 2 головки.
  • (На компьютере разработчика) Внесите изменения в dev, затем используйте "пересадку hg", чтобы скопировать соответствующие изменения в продукцию.
  • нажмите на мастер-репозиторий
  • (На рабочем сервере) Потяните из мастер-репо, обновите его до прогона

Примечание. Вы также можете внести изменения прямо в prod, пока вы пересаживаете изменения в dev.

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

4b9b3361

Ответ 1

Я бы использовал Mercurial Queues для чего-то подобного. Храните основной репозиторий в качестве версии для разработки и используйте патч for-production, который вносит любые необходимые изменения для производства.

Ответ 2

Вот два возможных решения, в которых используется ртутный и один, не использующий ртуть:

  • Используйте имя хоста для переключения между prod и devel. У нас есть одна проверка в верхней части нашего файла настроек, которая смотрит на переменную среды SERVER_NAME. Если это www.production.com, это база данных prod, и в противном случае она выбирает конкретную или стандартную DB/dev/test/stage DB.
  • Используя Mercurial, просто у вас есть клон, который dev и клоун, которые производят, вносят все изменения в dev и время развертывания вытягивают из dev в prod. После вытаскивания у вас будет 2 головы в prod, расходящихся от одного общего предка (последнее развертывание). У одной главы будет один набор изменений, содержащий только различия между развертываниями dev и prod, а другой будет иметь всю новую работу. Слейте их в клон prod, выбирая изменения продукта в конфликте, конечно, и у вас есть развертываемая установка, и вы готовы больше работать над "dev". Нет необходимости в ветвлении, пересадке или использовании очередей. Пока вы никогда не вытаскиваете этот набор изменений с настройками prod в "dev", он всегда будет нуждаться в слиянии после вытаскивания из dev, и если его просто несколько строк не так много сделать.

Ответ 3

Я решил это с локальными настройками.

  • Добавить в settings.py:

    
    try:
    from local_settings import *
    except ImportError:
    pass
    
  • touch local_settings.py

  • Добавьте ^local_settings.py$ в свой .hgignore

Каждое развертывание, которое у меня есть, имеет собственные локальные настройки (обычно разные элементы базы данных и разные адреса электронной почты происхождения).

PS: Только читайте "уменьшенные версии части javascript" позже. Для этого я хотел бы предложить крюк после обновления и настройку конфигурации (например, JS_EXTENSION).

Пример (с вершины моей головы! не проверены, при необходимости приспособитесь):

  • Поместите JS_EXTENSION = '.raw.js' в ваш settings.py файл;
  • Поместите JS_EXTENSION = '.mini.js' в ваш local_settings.py файл на рабочем сервере;
  • Изменить включение JS:
    <script type="text/javascript" src="blabla.js"></script>
    Для того, чтобы:
    <script type="text/javascript" src="blabla{{JS_EXTENSION}}"></script>
  • Создайте крюк после обновления, который ищет *.raw.js и генерирует .mini.js (сокращенные версии raw);
  • Добавьте .mini.js$ к вашему .hgignore

Ответ 4

Возможно, попробуйте что-то вроде этого: (Я просто думал об этой проблеме, в моем случае это база данных sqlite)

  • Добавить settings.py в .hgignore, чтобы сохранить его вне репозитория.
  • Возьмите файлы settings.py из двух отдельных ветвей и переместите их в два отдельных файла, settings-prod.py и settings-dev.py
  • Создайте развертывание script, который копирует соответствующие параметры -X файл в settings.py, поэтому вы можете развернуть его в любом случае.

Если у вас есть несколько дополнительных файлов, сделайте то же самое для них. Если у вас много файлов, но они все в одном каталоге сами по себе, вы можете просто создать пару каталогов: production и development, а затем скопировать или сопоставить соответствующую ссылку в deploy каталог.

Если вы сделали что-то подобное, вы можете отказаться от необходимости разветвления вашего репозитория.

Ответ 5

Я на самом деле делаю это с использованием названных ветвей и прямого слияния вместо пересадки (что более надежно, ИМО). Обычно это работает, хотя иногда (когда вы редактировали разные файлы на другой ветке), вам нужно обратить внимание, чтобы не удалять различия снова при слиянии.

Таким образом, он отлично работает, если вы не меняете разные файлы.