Git hooks


git hooks  — сценарии, выполняемые на стороне клиента или на стороне сервера. Файлы хуков пишутся на любом скриптовом языке и размещаются в каталоге ./git/hooks. Они обязательно должны иметь бит исполнения.



Что такое git hook


Любой хук — просто сценарий, который возвращает код ответа. Если код ответа отличен от нуля (0 означает, что выполнение успешно) — произойдет прерывание и желаемое действие, такое как commit, не выполнится.



Хуки копируются в любой репозиторий при его инициализации с git init

Они могут использоваться на стороне сервера и на стороне клиента



Полная информация как всегда есть в документации и в man

man githooks



Хуки пользователя размещаются в ~/.git/hooks

cd .git/hooks && ls -ls

applypatch-msg.sample post-update.sample pre-commit.sample pre-push.sample update.sample
commit-msg.sample pre-applypatch.sample prepare-commit-msg.sample pre-rebase.sample


Пример вывода приведен на скриншоте:

Git hooks


Для всех сценариев, имеющихся по умолчанию задано расширение .sample. Если переименовать файл убрав расширение и дать права на исполнение хук станет активным.

mv pre-commit.sample pre-commit

chmod +x pre-commit



Тут хук, который активировали сейчас является самым базовым. Он будет выполняться до того как будет выполнен коммит каждый раз когда разработчик вводит соответствующую команду



pre-commit проверяет есть ли среди файлов, которые коммитятся такие, имя которых находится не в кодировке ASCII. Если такие есть результат выполнения bash скрипта pre-commit будет 1, и коммита не произойдет. Вместо него в консоль выведется сообщение об ошибке поясняющее причины возникших трудностей.



Создаются хуки на пользовательской стороне для собственного удобства, их всегда можно обойти выполнив команду с ключом --no-verify

git commit --no-verify



Git hooks на стороне сервера


На сервере — в удаленном приватном репозитории (или на github) также имеются хуки. Они размещаются в КАТАЛОГ_ПРОЕКТА/hooks/

Их предназначение обычно в другом, такие хуки используют для ограничения доступа. В предыдущем случае коммит бы просто не выполнился. Если ограничить список разработчиков, которые могут коммитить изменения со стороны сервера — коммит будет выполняться, но сервер отклонит попытку внесения изменений.



Таким образом удобно разделять права к репозиторию или запрещать определенным разработчикам вносить изменения в ветку master.

Читайте также про использование алиасов git alias, они повышают удобство использования git.

Сказать спасибо