#git #hook #environment #githooks
#git #перехват #Окружающая среда #githooks
Вопрос:
Я только начал писать веб-приложение.
Я использую GIT для контроля версий, и у меня есть git и веб-сервер на одном компьютере.
Приложение имеет 3 среды: dev, test и production
Я хочу использовать git hook после каждой фиксации для обновления приложения для разработки, тестирования или производства.
какова наилучшая практика для этого?
Мне нужно что-то вроде этого:
- когда я фиксирую, dev должен автоматически обновляться
- когда сообщение о фиксации содержит «test:» перед сообщением — dev и test должны быть обновлены.
- когда сообщение о фиксации содержит «production: » перед сообщением — production, dev и test должны быть обновлены.
Спасибо!
Комментарии:
1. Просто предложение (потому что оно кажется более последовательным и простым): используйте одну ветку для разработки, одну для тестирования и одну для производства. Каждый раз, когда вы нажимаете на «test», хук должен обновлять вашу тестовую среду (и так далее).
Ответ №1:
Я только что написал скрипт hook / mini bash для решения этой проблемы
#!/bin/bash
if git log --pretty=format:%s -1 | grep -q "^test: "
then
#action / update dev/test
elif git log --pretty=format:%s -1 | grep -q "^production: "
then
#action / update dev/test/production
else
#action / update dev
fi
Это мой первый скрипт bash, поэтому .. пожалуйста, помогите улучшить это 🙂
Комментарии:
1. Использование
git checkout -f
здесь может быть полезным.
Ответ №2:
Основываясь на идее Иракли, вот что у меня работает как post-receive в моем репозитории…
#!/bin/bash
MESSAGE=$(git log -1 HEAD --pretty=format:%s)
if [[ "$MESSAGE" == *[staging]* ]];
then
#action / update staging
# another method not being used...
# GIT_WORK_TREE=/path/to/working/site/ git checkout -q -f staging
echo "NOTE: Beginning Auto-Push to Staging Server... "
`git push staging`
echo "========================================================
======== Done! Pushed to STAGING.com =============
======== Thanks Captain. Keep up the good work! ========
========================================================"
elif [[ "$MESSAGE" == *[production]* ]];
then
#action / update production
echo "NOTE: Beginning Auto-Push to Production Server... "
# `git push production`
echo "========================================================
======== Done!!! Pushed to Production.com =======
======== Test immediately for any errors! =========
========================================================"
fi
Примечание:
чтобы заставить «git push staging» работать, вам необходимо иметь .git/hooks/ post-reveive хук в этом рабочем дереве. Я использовал этот код, за исключением того, что я добавил «umask 002 amp;amp; git reset —hard» внизу.
Мне также пришлось добавить denyrecive в файл .git / config этого рабочего дерева:
[receive]
denycurrentbranch = ignore
Примечание 2:
Пожалуйста, обратите внимание, что эта настройка НЕ для всех… только для небольших (иш) сайтов, где быстрые и грязные обновления в порядке.
Ответ №3:
Вы можете написать перехват после фиксации, который будет анализировать сообщение о фиксации с помощью чего-то вроде git log -1 --format=%B
и выполнять соответствующие действия, например git push dev
, etc.
Если вы говорите о передаче ваших коммитов в удаленное центральное репозиторий, и это репозиторий должен это сделать, тогда вы должны использовать post-receive
хук аналогичным образом. Обратите внимание, что перехваты фиксации выполняются в клиентском репозитории, где вы фиксируете.
С учетом сказанного, переход к средам с использованием того, что вы говорите в сообщении, не является правильным рабочим процессом. У вас могут быть разные ветки, где вы можете выбирать свои коммиты и т. Д. Вы можете настроить перехваты таким образом, чтобы при переходе к test
ветке тестовая среда обновлялась и так далее.
Комментарии:
1. Вы помогли мне, но это не полный ответ. Пожалуйста, проверьте мой новый пост об этой проблеме. Еще раз спасибо!