Автоматизация проверок перед коммитом

Автоматизация 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

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

Ресурсы