git hooks

Често пишем код, който не искаме да остава в приложението ни. Хубав пример за това са debug statement-и на pdb/ipdb. Освен това понякога имаме навика дори да сме обучили редактора си да ни се кара за стилистични грешки в кода, да се правим на ударени.

Има хубаво решение на този проблем в git, чрез така наречените hooks.

Git hooks са изпълними файлове на специално място във вашето git хранилище, които могат да се изпълняват като форма на валидация или автоматизация при различни събития в хранилището. За нашата цел ни е необходим pre-commit hook. Както може да се досетите от името му, той се изпълнява преди да сесъздаде един commit.

Логиката е много проста: При изпълнение на командата git commit точно преди да създаде истинкия commit обект(каквото и да означава това), git ще погледне дали в .git/hooks има изпълним файл, който се казва pre-commit и ако има такъв ще го изпълни. Ето малък пример:

such_awesome_much_project_very_python/.git/hooks/pre-commit

#!/bin/sh

# Get all the python files staged for committing
py_files=`git diff --name-only HEAD|grep '.py$'`
# If we;re trying to commit a pdb.set_trace() display an error message and exit right away with status 1
grep -n 'pdb.set_trace()' $py_files && echo -e "\033[1;31m Debugger statements!!!\033[0m" && exit 1
# Run pyflakes on all the files beign committed and exit with status 0 if there are no errors, else show error message
pyflakes $py_files && exit || echo -e "\033[1;31m Lint error!\033[0m"

# If we’re here, then pyflakes failed, exit with status 1
exit 1

По-shiny версия може да видите под формата на този gist

Ако изпълнението на pre-commit е приключило със статус 0, git приема, че всичко е наред и продължава със създаването на новия commit. Ако се върне нещо различно, то git ще приключи работата си и commit-а, няма да бъде създаден.

В крайни случаи, когато сте много твърдо убедени, че искате да commit-неte нещо, за което вашия pre-commit hook ще е недоволен, можете да изпълните git commit --no-verify.(Силно препоръчително е да сте поне 124.34% уверени, че искате да го направите)