Хуки Git - это вообще дерьмо. Они позволяют запускать любой скрипт в разные моменты жизненного цикла коммита.

Хук предварительной фиксации, например, позволяет вам выполнить сценарий до того, как команда фиксации что-либо сделает. Это может быть полезно, если вы хотите провести линтинг или протестировать свой код перед его фиксацией.

Их раздражает то, что файлы сценариев перехвата лежат в вашей папке .git, которая является вашей локальной базой данных Git. Это означает, что они не берутся за дело. И каждый член вашей команды должен вручную скопировать файлы хуков Git в нужное место в папку, которая по умолчанию скрыта в вашем каталоге 😐.

Итак, что делать, если вы хотите сохранить свои скрипты хуков Git в своем репозитории и хотите, чтобы вся ваша команда надежно выполняла те же самые хуки Git?

Для этого есть пакет npm. Он называется Хаски. Я Хаски!

Husky позволяет вам зафиксировать скрипт для вашего хука Git в вашем репозитории и гарантирует, что они будут надежно выполняться для всех, кто проверяет и устанавливает ваш проект.

Как это работает?

Когда вы устанавливаете Husky с помощью npm или yarn, он выполняет postinstall сценарий, который копирует сценарий bash для каждой отдельной ловушки Git в папку .git/hooks. Когда вызываются хуки Git, эти скрипты проверяют наличие сценария npm с тем же именем, что и хуки Git, и запускают его, если он существует.

Это означает, что после установки Husky вы можете добавить скрипты npm в свой package.json следующим образом:

...
"scripts": {
  "precommit": "eslint"
}
...

Husky обязательно выполнит этот сценарий при вызове ловушки предварительной фиксации.

Это означает, что вы можете запускать любой скрипт для любой ловушки Git, какой захотите. Вам просто нужно убедиться, что существует сценарий npm с соответствующим именем хука Git (только без тире).

Это упрощает управление хуками Git и делает их применимыми для всей команды, работающей над одним проектом.

Это также упрощает тестирование скриптов, потому что вы можете просто запустить их с помощью npm, например: npm run precommit.

Важная небольшая деталь, которую я обнаружил при использовании Husky на работе, заключается в том, что сценарий Husky postinstall не выполняется, когда проект устанавливается системой CI. Это замечательно, потому что обычно ваш CI объединяет ветки в master, и вы обычно не хотите, чтобы в этом случае запускались хуки Git.

Мне было любопытно узнать, откуда Husky узнает, что он устанавливается на CI, поэтому я проверил код. Он использует пакеты npm с именем is-ci, который, в свою очередь, использует пакет npm с именем ci-info, который в основном просто проверяет набор известных имен / констант / переменных среды различных систем CI. Таким образом, Husky не выполняет postinstall, если они существуют.

Очень круто, я уже задумался, как исключить Husky при CI-установках 😄.

Короче говоря, Husky - отличный способ управлять сценариями ловушек Git в вашем проекте.