Автоматизация проверок перед коммитом
Автоматизация pre-commit проверок — настройка Git-хуков для автоматического запуска линтинга, форматирования и валидации при каждом git commit.
Зачем нужно
Ручное соблюдение стандартов кода ненадёжно: разработчики забывают форматировать код, пишут нестандартные коммиты, допускают ESLint-ошибки. Автоматические проверки при коммите — «ворота качества» на уровне репозитория, которые невозможно обойти случайно.
Где используется
- Командные проекты с общими стандартами кода
- Open source репозитории
- Проекты с CI/CD — предотвращение ошибок ещё на локальной машине
- Любой проект, где важен единый стиль кода
Стек инструментов
Husky — управление Git-хуками
lint-staged — линтинг только staged файлов (быстро)
ESLint — проверка качества кода
Prettier — форматирование кода
commitlint — стандарт сообщений коммитов
Полная настройка
1. Установка
npm install --save-dev husky lint-staged \
eslint prettier \
@commitlint/cli @commitlint/config-conventional
# Инициализация Husky
npx husky init
2. package.json
{
"scripts": {
"prepare": "husky",
"lint": "eslint . --ext .ts,.tsx,.js,.jsx",
"format": "prettier --write .",
"format:check": "prettier --check ."
},
"lint-staged": {
"*.{ts,tsx,js,jsx}": ["eslint --fix", "prettier --write"],
"*.{json,md,css,yml}": "prettier --write"
}
}
3. Хуки Husky
# .husky/pre-commit — перед каждым коммитом
cat > .husky/pre-commit << 'EOF'
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"
echo "🔍 Running pre-commit checks..."
npx lint-staged || exit 1
echo "✅ Pre-commit checks passed"
EOF
# .husky/commit-msg — валидация сообщения коммита
cat > .husky/commit-msg << 'EOF'
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"
npx --no -- commitlint --edit "$1"
EOF
# .husky/pre-push — перед push (запуск тестов)
cat > .husky/pre-push << 'EOF'
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"
echo "🧪 Running tests before push..."
npm test -- --passWithNoTests
EOF
chmod +x .husky/pre-commit .husky/commit-msg .husky/pre-push
4. commitlint.config.js
export default {
extends: ['@commitlint/config-conventional'],
rules: {
'header-max-length': [2, 'always', 100],
},
};
5. .eslintrc.json (минимальный)
{
"extends": ["eslint:recommended"],
"env": { "node": true, "es2022": true },
"parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }
}
6. .prettierrc
{
"semi": true,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "all",
"tabWidth": 2
}
Разделение проверок по хукам
pre-commit (быстро, <5 сек):
✅ lint-staged (ESLint + Prettier) — только changed файлы
commit-msg (мгновенно):
✅ commitlint — стандарт сообщения
pre-push (медленнее, ~30 сек):
✅ npm test — запуск тестов
✅ tsc --noEmit — проверка типов
Пропуск хуков (только в экстренных случаях)
git commit --no-verify -m "fix: emergency hotfix"
git push --no-verify
Частые ошибки
- Тяжёлые задачи (полный запуск тестов) в pre-commit — медленно, отталкивает разработчиков
--no-verifyкак привычка — теряется смысл автоматизации- Нет
"prepare": "husky"— хуки не устанавливаются приnpm installу новых участников - Разные версии ESLint/Prettier у разработчиков без
enginesв package.json
Связанные темы
- _MOC Инструменты
- Husky -- Git hooks
- lint-staged -- линтинг staged файлов
- commitlint -- стандарт коммитов