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/ не закоммичен в репозиторий — хуки есть только у автора

Связанные темы

Ресурсы