Использование хуков git до фиксации и после обновления
Добавление некоторой дополнительной обработки к вашему рабочему процессу git иногда полезно / круто / интересно, а функциональность, предоставляемая githooks, делает это довольно доступным для использования. Я обычно использую очень немногие из них (вместо того, чтобы что-то происходило на стороне сервера - тесты и т.д., которые могут быть включены извне или с помощью обработчиков на стороне сервера) на стороне клиента, и адаптирую два, включенных в .git/hooks/
по умолчанию, pre-commit
и post-update
, как вы уже догадались, до того, как будут сделаны коммиты, и после того, как набор коммитов будет отправлен.
В качестве инженера по эксплуатации я часто использую такие инструменты, как Terraform, преимущество которого заключается в том, что он включает инструмент форматирования и инструмент проверки - это хороший пример того, где может быть полезен хук предварительной фиксации, - прежде чем я создам фиксации, я могу проверить манифест и проверить форматирование / стиль обновляемых манифестов. Я могу сделать это, изменив в корне моего проекта .git/hooks/pre-commit.sample
и добавив что-то вроде этого для проверки файлов .tf
на соответствие этим стандартам:
modified_files=$(git ls-files -m)
for f in modified_files
do
if [-e "$f" ] && [[ $f == *.tf ]]; then
terraform validate $(dirname $f)
terraform fmt $f -check=true
git add $f
fi
done
Я адаптировал свой подход из сценария перехвата перед фиксацией Джеймса Тернбулла, чтобы обработать это немного по-другому, он также подчеркивает, что это в основном просто скриптовый интерфейс для управления поведением git.
Чтобы включить эту ловушку, скопируйте файл в .git/hooks/pre-commit
(без .sample
).
Давайте посмотрим на более сложный пример в моем сценарии post-update
. В моем случае я работаю на Mac, поэтому я хотел бы максимально использовать это - возможно, ввести еще несколько визуальных подсказок, которым я буду следовать, поэтому я также хочу использовать некоторый Applescript.
В .git/hooks/post-update
, я хочу получить хэш и сообщение последней отправленой фиксации, а также ветку, которую я отправил:
COMMIT=$(git log -1 HEAD | head -n 1 | awk '{print $1}')
MESSAGE=$(git log --format=%B -n 1 $COMMIT | xargs echo )
BRANCH=$(git branch | grep \* | cut -d ' ' -f2)
и чтобы сделать это полезным, я могу увидеть сводку моего последнего push, добавив этот вызов в osascript
:
/usr/bin/osascript <<EOF
display dialog "To $BRANCH:\n\n$MESSAGE\n\n\t($COMMIT)\n" with title "Git Push" buttons {"I meant to do that"} default button 1
Чтобы появилось всплывающее диалоговое окно и просто напоминание о том, что я сделал, поэтому я останавливаюсь, чтобы проверить свою работу в последний раз, прежде чем перейти к следующей задаче.