использование git hook после фиксации

#git #hook #environment #githooks

#git #перехват #Окружающая среда #githooks

Вопрос:

Я только начал писать веб-приложение.

Я использую GIT для контроля версий, и у меня есть git и веб-сервер на одном компьютере.

Приложение имеет 3 среды: dev, test и production

Я хочу использовать git hook после каждой фиксации для обновления приложения для разработки, тестирования или производства.

какова наилучшая практика для этого?

Мне нужно что-то вроде этого:

  1. когда я фиксирую, dev должен автоматически обновляться
  2. когда сообщение о фиксации содержит «test:» перед сообщением — dev и test должны быть обновлены.
  3. когда сообщение о фиксации содержит «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. Вы помогли мне, но это не полный ответ. Пожалуйста, проверьте мой новый пост об этой проблеме. Еще раз спасибо!