Как реализовать ветвь развертывания в Git

Я использую git для проекта PHP, я думаю, что это действительно удобно. Есть одна вещь, которая была бы замечательной, если бы я получил ее на работу.

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

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

Проблема заключается в том, что когда я объединяю ветки, те файлы, которые должны быть разными, тоже сливаются.

Есть ли удобный способ достичь такого? Как это обычно делается?

Ответ 1

Я не уверен, что Git предполагается использовать таким образом.

Сначала быстрый совет Linus, всегда "красочный" и информативный;)

Git очень принципиально отслеживает состояние проекта, а не состояние файла. Это означает, что вы очень НЕ можете пытаться "объединить файл". Это бессмысленная операция в git, и на самом деле любой SCM, который позволяет это в значительной степени обречен быть полной частью sht().

(*) И я не говорю, что только потому, что Git этого не делает. Это гораздо более фундаментально. Когда вы начинаете делать разветвление и слияние файлов, вы в основном ввернули себя, и вы больше не сможете работать над проектом как "целый проект" - у вас больше нет четко определенной истории, которая на самом деле это история всего проекта.


Там.

Тем не менее, вы могли:

  • управлять этими файлами config/doc отдельными подпроектами Git (обратите внимание: здесь обсуждалось использование подмодулей )
  • или записать частичное слияние (используя стратегию "наш" для файлов, которые мы не хотим объединять), затем - замените ее.

Другие решения в этом потоке включают работу с ветвью на сервере на сервере развертывания

Development        Deployment

#origin/master:
x--x               $ git clone

                   # master
                   x--x

                   $ git checkout -b deployment origin/master

                   x--x
                       \ 
                        -- #deployment

                   $ .... #makes changes for config files
                          #or other specific deployment files

                   x--x
                       \
                        --d1--d2 # no need to push that branch ever.

#new developments
x--x--x--x

                   $ git pull --rebase #pull origin/master and 
                                       #replay current branch on top of it
                   x--x--x--x
                             \
                              --d1'--d2' #SHA1 rewritten in deployment branch
                                         #not important since this branch 
                                         #is not pushed (published)

Ответ 2

Это работает для меня, и я делаю только небольшие изменения конфигурации для развертывания (3 строки в файлах конфигурации).

  • Клонирование вашего репозитория из GitHub или где бы вы его не хранили. Где вы хотите развернуть.

  • Запустите git checkout -b deployment origin/master.

  • Сделайте свои изменения (нажмите их, если хотите).

  • Всякий раз, когда ваш мастер (или любая ветка, из которой вы сделали развертывание), имеет изменения, которые вы хотите развернуть, просто git pull --rebase.

Это простое решение, и это, безусловно, работает для меня, я не могу говорить с ним, или нет, это делает его "shi * t", как предлагают другие, но это, безусловно, очень полезно для наших целей.

Ответ 3

Я делаю несколько глупых трюков вроде:

  • Попросите приложение прочитать файл config
  • Добавить config.development и config.production, но не config в репозиторий
  • Развернуть развертывание script не только для клонирования репозитория, но и для cp config.production config

В этом смысл?

Он работает хорошо для меня.

Ответ 4

Быстрый ответ: никогда не сливайте ветки. На самом деле вам вообще не нужно их объединять, просто сливайте с разработки (aka "master" ) до развертывания, чтобы объединить исправления и общие изменения.

Ответ 5

Если вы хотите, чтобы ваша история была приятной, вы можете хранить файлы развертывания в некоторых коммитах поверх вашей чистой ветки. Затем, когда придет время для развертывания новой версии, вы проверяете ветвь развертывания и "git мастер переадресации", чтобы поместить эти коммиты поверх исходной ветки.

Таким образом, вы также можете легко внести изменения в файлы конфигурации и изменить верхний фиксатор с помощью "git commit -amend".

Ответ 6

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

т.е. я отключаю мастер с новой веткой с именем "master-deployed" и вношу изменения в эту ветку, что мне нужно только в тестовой версии на сервере сборки (например, добавление предупреждения о том, что это не живая версия и другой сервер db в web.config).

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

То же самое касается кончика qa, который имеет ветвь qa-deployed

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

Итак, на сервере сборки построение qa выглядит примерно так:

git reset --hard
git clean -xfd
git checkout -f qa-deployed
git rebase --onto qa HEAD^ qa-deployed
build-script

Ответ 7

У меня была аналогичная проблема, и я создал небольшой проект под названием config-magic, который поможет справиться с этим.

Config-magic позволяет создавать файлы шаблонов шаблонов, а затем профили данных для каждого из dev/staging/production. Затем вы запускаете "cfg dev" для создания конфигурационных файлов "dev", "cfg staging" для создания промежуточной конфигурации и т.д.

Затем я подключился со сценариями, так что, когда я развертываю на этапе, я локально запускаю "cfg staging", затем scp поверх всех файлов конфигурации после обновления базы кода из git.

"Фактические" файлы конфигурации устанавливаются как игнорируемые с помощью git. До сих пор это работало очень хорошо.

https://github.com/apinstein/config-magic/tree

Ответ 8

Я думал обо всех этих решениях для своей ситуации, но никто из них, похоже, не применим. Я редактирую как на своих серверах live, так и на серверах разработки. Rebase работает хорошо, если вам не нужно переиздавать эту ветку, но я вношу изменения в свою ветку развертывания и публикую их обратно в основной репозиторий. Метод подмодуля работает только в том случае, если ваши файлы находятся в отдельном субдире, мои файлы конфигурации находятся в нескольких местах. Метод merge ours не будет работать так хорошо, так как мне придется сначала вытащить эту ветку, а затем большую ветку. Может быть, это сработает, если еще есть слияние, и я мог бы потянуть в нужную конфигурационную ветвь, когда это необходимо. На данный момент работает .gitignore, и я просто загружаю файлы вручную.

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

Ответ 9

cherry-pick, похоже, работает для этого для этого (за счет загрязнения журналов немного).

git checkout -b тестирование вносить изменения и совершать git мастер проверки git checkout -b развернуть вносить изменения и совершать git мастер проверки

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

Ответ 10

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