Какие инструменты существуют для хуков pre-commit и pre-push в Git
Что проверяют
Знаете ли вы, как сделать хуки общими для всей команды, если каталог .git/hooks в репозиторий не попадает. И понимаете ли, что хук это удобство для разработчика, а не гарантия: следом почти всегда спрашивают, что будет, если его обойти.
Как отвечать
- Husky: стандарт во фронтенд-проектах. В актуальной версии
npx husky initсоздаёт каталог.husky/и скрипт"prepare": "husky"вpackage.json. Хуки это обычные shell-файлы вроде.husky/pre-commit, Husky лишь выставляетcore.hooksPath. В CI его отключают переменнойHUSKY=0; - lint-staged: запускает команды только на застейдженных файлах, например
"*.{ts,tsx}": ["eslint --fix", "prettier --write"], и сам добавляет исправления обратно в индекс; - lefthook: один бинарник без зависимости от Node, конфиг
lefthook.yml, умеет запускать команды параллельно и фильтровать файлы по glob. Хорош для монорепозиториев и смешанных стеков; - simple-git-hooks: минимальный вариант, хуки описываются прямо в
package.json; - pre-commit: фреймворк на Python с
.pre-commit-config.yamlи готовыми хуками для разных языков, встречается там, где рядом живёт бэкенд; - commitlint на хуке
commit-msg: проверяет формат сообщения, например Conventional Commits; - без инструментов:
git config core.hooksPath .githooksи свои скрипты в репозитории.
Разумное разделение: в pre-commit быстрые проверки только изменённого (линтер, форматтер), в pre-push то, что требует всего проекта: tsc --noEmit и юнит-тесты.
Где спотыкаются
Показывают конфиг "husky": { "hooks": ... } в package.json. Это синтаксис четвёртой версии, современный Husky его не читает.
Кладут в pre-commit полный прогон тестов и сборку. Коммит начинает занимать минуту, и команда привыкает к --no-verify.
Считают хук защитой ветки. Он обходится флагом --no-verify и не ставится, если кто-то пропустил npm install, поэтому те же проверки обязаны повторяться в CI. Отдельная ловушка: tsc с перечнем файлов из lint-staged игнорирует tsconfig.json, поэтому типы проверяют по всему проекту.