Налаштування Husky для Git-хуків у веб-проектах
Husky дозволяє запускати скрипти при git-подіях: перед коммітом, перед пушем, при написанні повідомлення коміту. Практичне застосування: автоматичний запуск лінтера перед кожним коммітом запобігає потраплянню "зламаного" коду в історію.
Встановлення
npm install --save-dev husky
npx husky init
Після init створюється директорія .husky/ з базовим хуком pre-commit і додається скрипт "prepare": "husky" у package.json. Скрипт prepare запускається автоматично при npm install — нові члени команди отримують хуки без додаткових кроків.
pre-commit Хук
.husky/pre-commit:
npx lint-staged
Запускає lint-staged — інструмент, який застосовує команди тільки до поставлених на сцену файлів, а не на весь проект. Конфігурація lint-staged у окремому файлі.
commit-msg Хук
Перевіряє формат повідомлення коміту. Зручно з Conventional Commits:
npm install --save-dev @commitlint/cli @commitlint/config-conventional
.husky/commit-msg:
npx --no -- commitlint --edit $1
commitlint.config.mjs:
export default {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'revert', 'perf', 'ci'],
],
'subject-max-length': [2, 'always', 72],
'body-max-line-length': [2, 'always', 100],
},
};
Правильний коміт: feat: add user authentication. Невірний: added stuff — хук заблокує.
pre-push Хук
Для запуску тестів перед пушем:
.husky/pre-push:
npm run test:ci
npm run typecheck
Тесты перед пушем, а не перед кожним коммітом — компроміс між швидкістю та надійністю. Якщо тесты повільні, pre-commit з тестами знищує продуктивність.
prepare-commit-msg Хук
Автоматично додає номер завдання з імені гілки до повідомлення коміту:
.husky/prepare-commit-msg:
#!/bin/sh
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
# Витягуємо номер завдання з імені гілки (наприклад, feature/PROJ-123-description)
BRANCH_NAME=$(git symbolic-ref --short HEAD 2>/dev/null)
TICKET=$(echo "$BRANCH_NAME" | grep -oE '[A-Z]+-[0-9]+' | head -1)
# Додаємо тільки якщо ще не присутній і це не merge/rebase
if [ -n "$TICKET" ] && [ "$COMMIT_SOURCE" != "merge" ] && [ "$COMMIT_SOURCE" != "squash" ]; then
CURRENT_MSG=$(cat "$COMMIT_MSG_FILE")
if ! echo "$CURRENT_MSG" | grep -q "$TICKET"; then
echo "[$TICKET] $CURRENT_MSG" > "$COMMIT_MSG_FILE"
fi
fi
Обхід хуків в екстрених випадках
git commit --no-verify -m "hotfix: emergency patch"
git push --no-verify
--no-verify пропускає хуки. Це навмисна можливість для екстрених ситуацій, а не обхід системи — логується в історії git.
CI та хуки
У CI-середовищі хуки не потрібні — там лінтинг та тесты запускаються явно. Husky автоматично пропускає встановлення хуків, якщо встановлена змінна CI=true:
# husky не встановлює хуки при CI=true
HUSKY=0 npm ci # або
CI=true npm install
Часові рамки
Встановлення Husky з pre-commit + lint-staged: 30–60 хвилин. Додавання commitlint та налаштування Conventional Commits: ще 30–60 хвилин.







