A Git hooks manager for Node.js, Ruby, Python and many other types of projects.
Documentation
Read the introduction post
With Go (>= 1.23):
go install github.com/evilmartians/lefthook@latestWith NPM:
npm install lefthook --save-devFor Ruby:
gem install lefthookFor Python:
pip install lefthookInstallation guide with more ways to install lefthook: apt, brew, winget, and others.
Configure your hooks, install them once and forget about it: rely on the magic underneath.
# Configure your hooks
vim lefthook.yml
# Install them to the git project
lefthook install
# Enjoy your work with git
git add -A && git commit -m '...'lefthook.yml config options.Gives you more speed. docs
pre-push:
parallel: trueIf you want your own list. Custom and prebuilt examples.
pre-commit:
commands:
frontend-linter:
run: yarn eslint {staged_files}
backend-linter:
run: bundle exec rubocop --force-exclusion {all_files}
frontend-style:
files: git diff --name-only HEAD @{push}
run: yarn stylelint {files}If you want to filter list of files. You could find more glob pattern examples here.
pre-commit:
commands:
backend-linter:
glob: "*.rb" # glob filter
exclude: '(^|/)(application|routes).rb$' # regexp filter
run: bundle exec rubocop --force-exclusion {all_files}If you want to execute the commands in a relative path
pre-commit:
commands:
backend-linter:
root: "api/" # Careful to have only trailing slash
glob: "*.rb" # glob filter
run: bundle exec rubocop {all_files}If oneline commands are not enough, you can execute files. docs
commit-msg:
scripts:
"template_checker":
runner: bashIf you want to control a group of commands. docs
pre-push:
commands:
packages-audit:
tags:
- frontend
- linters
run: yarn lint
gems-audit:
tags:
- backend
- security
run: bundle auditIf you are in the Docker environment. docs
pre-commit:
scripts:
"good_job.js":
runner: docker run -it --rm <container_id_or_name> {cmd}If you a frontend/backend developer and want to skip unnecessary commands or override something into Docker. docs
# lefthook-local.yml
pre-push:
exclude_tags:
- frontend
commands:
packages-audit:
skip: trueIf you want to run hooks group directly.
$ lefthook run pre-commitIf you want to run specific group of commands directly.
fixer:
commands:
ruby-fixer:
run: bundle exec rubocop --force-exclusion --safe-auto-correct {staged_files}
js-fixer:
run: yarn eslint --fix {staged_files}$ lefthook run fixerYou can control what lefthook prints with output option.
output:
- execution
- failureCheck examples