Husky: Git hooks
Husky — инструмент для управления Git-хуками в проектах Node.js, позволяющий автоматически запускать скрипты при git-событиях (commit, push, merge).
Зачем нужно
Git-хуки позволяют автоматизировать проверки: линтинг, форматирование, тесты, валидация сообщения коммита. Без инструментов хуки хранятся в .git/hooks — папке, не попадающей в репозиторий. Husky решает эту проблему: хуки хранятся в проекте, устанавливаются через npm install и применяются у всей команды.
Где используется
- Проверка кода перед коммитом (pre-commit: ESLint, Prettier, тесты)
- Валидация сообщений коммитов (commit-msg: commitlint)
- Запрет прямого push в main/master (pre-push)
- Командные проекты с общими стандартами качества кода
Установка и настройка
# Установка
npm install --save-dev husky
# Инициализация (создаёт .husky/ и npm prepare скрипт)
npx husky init
// package.json — скрипт prepare запускается при npm install
{
"scripts": {
"prepare": "husky"
}
}
Создание хуков
# pre-commit — запускается перед каждым коммитом
# Создаёт файл .husky/pre-commit
echo "npx lint-staged" > .husky/pre-commit
# commit-msg — валидация сообщения коммита
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg
# pre-push — перед push (тесты)
echo "npm test" > .husky/pre-push
Пример .husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Запускаем lint-staged (линтинг только изменённых файлов)
npx lint-staged
# Запуск проверки типов TypeScript
npx tsc --noEmit
Пример .husky/commit-msg
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Проверяем формат сообщения коммита через commitlint
npx --no -- commitlint --edit "$1"
Полный pre-commit с несколькими проверками
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
echo "Запуск pre-commit проверок..."
# 1. Линтинг и форматирование staged файлов
npx lint-staged || { echo "lint-staged failed"; exit 1; }
# 2. Проверка типов (только если изменены .ts файлы)
if git diff --cached --name-only | grep -q "\.ts$"; then
npx tsc --noEmit || { echo "TypeScript errors found"; exit 1; }
fi
echo "Все проверки пройдены!"
Интеграция с lint-staged
// package.json
{
"lint-staged": {
"*.{js,ts,jsx,tsx}": ["eslint --fix", "prettier --write"],
"*.{json,md,css}": "prettier --write"
}
}
Пропуск хука (экстренно)
# Пропустить все хуки — только в экстренных случаях
git commit --no-verify -m "fix: emergency hotfix"
git push --no-verify
Частые ошибки
- Нет
"prepare": "husky"вpackage.json— хуки не устанавливаются приnpm installу других - Хук без
exit 1при ошибке — коммит проходит даже при ошибке линтера - Тяжёлые проверки в pre-commit — запуск полных тестов там слишком долго, лучше в pre-push
.husky/не закоммичен в репозиторий — хуки есть только у автора
Связанные темы
- _MOC Инструменты
- lint-staged -- линтинг staged файлов
- commitlint -- стандарт коммитов
- Автоматизация проверок перед коммитом