Как реализовать ветвь развертывания в 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
В настоящее время у меня есть пара файлов исправлений, и сервер сборки применяет эти исправления для соответствующих версий. хотя у меня есть другие мысли об этом в данный момент