Lefthook
The fastest polyglot Git hooks manager out there
Fast and powerful Git hooks manager for Node.js, Ruby or any other type of projects.
- Fast. It is written in Go. Can run commands in parallel.
- Powerful. It allows to control execution and files you pass to your commands.
- Simple. It is single dependency-free binary which can work in any environment.
Install
With Go (>= 1.20):
go install github.com/evilmartians/lefthook@latest
With NPM:
npm install lefthook --save-dev
With Ruby:
gem install lefthook
Installation guide with more different installation instructions.
Usage
Lefthook is easy to use. Once you configure and setup you can forget that it even exists and rely on the magic underneath.
See:
- Usage of lefthook CLI utility.
- Configuration details for
lefthook.yml
- Wiki for other information.
- Discussions if you want to ask a question, suggest a feature, or report a bug.
Why Lefthook
-
Parallel execution
Gives you more speed. Example
pre-push:
parallel: true
-
Flexible list of files
If 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}
-
Glob and regexp filters
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.rb|routes.rb" # regexp filter
run: bundle exec rubocop --force-exclusion {all_files}
-
Execute in sub-directory
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}
-
Run scripts
If oneline commands are not enough, you can execute files. Example.
commit-msg:
scripts:
"template_checker":
runner: bash
-
Tags
If you want to control a group of commands. Example.
pre-push:
commands:
packages-audit:
tags: frontend security
run: yarn audit
gems-audit:
tags: backend security
run: bundle audit
-
Support Docker
If you are in the Docker environment. Example.
pre-commit:
scripts:
"good_job.js":
runner: docker run -it --rm <container_id_or_name> {cmd}
-
Local config
If you a frontend/backend developer and want to skip unnecessary commands or override something into Docker. Description.
# lefthook-local.yml
pre-push:
exclude_tags:
- frontend
commands:
packages-audit:
skip: true
-
Direct control
If you want to run hooks group directly.
$ lefthook run pre-commit
-
Your own tasks
If 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 fixer
-
Optional output
If you don't want to see supporting information:
skip_output:
- meta #(version and which hook running)
- success #(output from runners with exit code 0)
Table of contents:
Guides
- Install with Node.js
- Install with Ruby
- Install with Homebrew
- Install for Debian-based Linux
- Install for RPM-based Linux
- Install for Arch Linux
- Usage
- Configuration
- Troubleshooting