используя git hook после коммита - PullRequest
5 голосов
/ 09 октября 2011

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

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

Приложение имеет 3 среды: dev,тестирование и производство

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

Каков наилучший способ для этого?

Мне нужно что-тонапример:

  1. когда я фиксирую, dev должен автоматически обновляться
  2. , когда сообщение о фиксации содержит «test:» перед сообщением - dev и test должны быть обновлены.
  3. когда сообщение о коммите содержит «production:» перед сообщением - должны быть обновлены production, dev и test.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 сентября 2012

Основываясь на идее Иракли, вот что я работаю в качестве пост-получения в моем репо ...

#!/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 -iveive на этом рабочем дереве. Я использовал этот код , за исключением того, что добавил внизу 'umask 002 && git reset --hard'.

Я также должен был добавить запрещение в файл .git / config этого рабочего дерева:

[receive]
    denycurrentbranch = ignore

Примечание 2:

Обратите внимание, что эта настройка не для всех ... только для небольших (ish) сайтов, где быстрые и грязные обновления подходят.

1 голос
/ 11 октября 2011

Я только что написал скрипт 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 голос
/ 10 октября 2011

Вы можете написать ловушку после фиксации, которая будет анализировать сообщение фиксации, используя что-то вроде git log -1 --format=%B и выполняя соответствующее действие, например git push dev и т. Д.

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

С учетом вышесказанного, отправка в окружение с использованием того, что вы говорите в сообщении, не является надлежащим рабочим процессом. У вас могут быть разные ветки, где вы можете выбрать свои коммиты и т. Д. Вы можете настроить хуки так, чтобы при переходе на ветку test тестовая среда обновлялась и т. Д.

...