Top Related Projects
A framework for managing and maintaining multi-language pre-commit hooks.
Git hooks made easy 🐶 woof!
A fully configurable and extendable Git hook manager
Fast and powerful Git hooks manager for any type of projects.
The commitizen command line utility. #BlackLivesMatter
📓 Lint commit messages
Quick Overview
Lefthook is a fast and powerful Git hooks manager for software development teams. It allows developers to easily manage, share, and execute scripts before committing or pushing code, ensuring consistent code quality and workflow across projects.
Pros
- Fast execution due to parallel running of tasks
- Language-agnostic, supporting various programming languages and tools
- Easy to configure and share across team members
- Supports both pre-commit and pre-push hooks
Cons
- Requires initial setup and configuration
- May add complexity to the development process for small projects
- Learning curve for team members unfamiliar with Git hooks
- Potential for over-reliance on automated checks
Code Examples
- Basic configuration in
lefthook.yml
:
pre-commit:
commands:
linter:
run: rubocop {staged_files}
tests:
run: rspec
This configuration runs RuboCop on staged files and executes RSpec tests before each commit.
- Using glob patterns to target specific files:
pre-push:
commands:
js-linter:
glob: "*.{js,jsx}"
run: eslint {all_files}
This example runs ESLint on all JavaScript and JSX files before pushing.
- Running commands in parallel:
pre-commit:
parallel: true
commands:
linter:
run: rubocop {staged_files}
tests:
run: rspec
security:
run: brakeman
This configuration runs linting, tests, and security checks in parallel before committing.
Getting Started
-
Install Lefthook:
gem install lefthook
-
Initialize Lefthook in your project:
lefthook install
-
Create a
lefthook.yml
file in your project root:pre-commit: commands: linter: run: rubocop {staged_files}
-
Commit changes to activate the hooks:
git add lefthook.yml git commit -m "Add Lefthook configuration"
Lefthook is now set up and will run the configured hooks on future commits.
Competitor Comparisons
A framework for managing and maintaining multi-language pre-commit hooks.
Pros of pre-commit
- Extensive plugin ecosystem with many pre-built hooks
- Language-agnostic, supporting multiple programming languages
- Well-established project with a large community and extensive documentation
Cons of pre-commit
- Configuration can be more complex, especially for beginners
- Requires Python installation, which may not be ideal for all projects
- Performance can be slower compared to native Git hooks
Code Comparison
pre-commit configuration example:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
Lefthook configuration example:
pre-commit:
commands:
lint:
glob: "*.{js,ts}"
run: npm run lint {staged_files}
format:
glob: "*.{js,ts}"
run: npm run format {staged_files}
Both tools offer flexible configuration options, but pre-commit relies more on external repositories for hooks, while Lefthook focuses on running local commands. pre-commit's YAML structure is centered around repositories and their associated hooks, whereas Lefthook organizes hooks by Git events and allows direct command execution.
Git hooks made easy 🐶 woof!
Pros of Husky
- Widely adopted and well-established in the JavaScript ecosystem
- Simpler setup process with automatic Git hooks installation
- Extensive documentation and community support
Cons of Husky
- Limited to JavaScript/Node.js projects
- Can be slower for large projects due to Node.js startup time
- Less flexible configuration options compared to Lefthook
Code Comparison
Husky configuration (.huskyrc.json
):
{
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm run lint"
}
}
Lefthook configuration (lefthook.yml
):
pre-commit:
commands:
tests:
run: npm test
pre-push:
commands:
linter:
run: npm run lint
Both tools aim to simplify Git hooks management, but Lefthook offers a more language-agnostic approach and advanced features like parallel execution and selective hook running. Husky, on the other hand, provides a more straightforward setup for JavaScript projects and has a larger user base. The choice between the two depends on project requirements, language preferences, and desired level of customization.
A fully configurable and extendable Git hook manager
Pros of Overcommit
- Written in Ruby, which may be preferred by Ruby developers
- Extensive plugin ecosystem with many pre-built hooks
- Supports parallel hook execution for improved performance
Cons of Overcommit
- Requires Ruby runtime, which may not be available in all environments
- Configuration can be more complex due to its extensive feature set
- Slower startup time compared to Lefthook
Code Comparison
Overcommit configuration (.overcommit.yml
):
PreCommit:
RuboCop:
enabled: true
command: ['bundle', 'exec', 'rubocop']
ESLint:
enabled: true
command: ['yarn', 'run', 'eslint']
Lefthook configuration (lefthook.yml
):
pre-commit:
commands:
rubocop:
run: bundle exec rubocop
eslint:
run: yarn run eslint
Both tools offer similar functionality for managing Git hooks, but Lefthook's configuration is generally more straightforward. Overcommit provides a richer set of built-in hooks and plugins, while Lefthook focuses on simplicity and performance. The choice between the two may depend on your project's specific needs and the development team's preferences.
Fast and powerful Git hooks manager for any type of projects.
Pros of Lefthook
- Lightweight and fast Git hooks manager
- Supports multiple languages and frameworks
- Easy configuration with YAML files
Cons of Lefthook
- Limited documentation for advanced use cases
- Fewer integrations compared to some alternatives
- May require additional setup for complex workflows
Code Comparison
Both repositories contain the same codebase, as they are the same project. Here's a sample configuration from Lefthook:
pre-commit:
parallel: true
commands:
linter:
glob: "*.{js,ts}"
run: yarn eslint {staged_files}
tests:
glob: "*.{js,ts}"
run: yarn jest --findRelatedTests {staged_files}
Summary
Lefthook is a versatile Git hooks manager that offers simplicity and flexibility. It's particularly useful for projects requiring custom pre-commit or pre-push checks. The tool supports parallel execution of commands and integrates well with various development environments. However, users might face challenges with more complex setups due to limited advanced documentation. Overall, Lefthook provides a solid foundation for managing Git hooks in development workflows.
The commitizen command line utility. #BlackLivesMatter
Pros of cz-cli
- Standardizes commit messages across teams and projects
- Provides an interactive CLI for creating structured commits
- Integrates well with semantic versioning and changelog generation
Cons of cz-cli
- Focuses primarily on commit message formatting, not overall git hooks
- May require additional setup for custom commit types or scopes
- Less flexible for implementing custom pre-commit or pre-push checks
Code Comparison
cz-cli:
module.exports = {
types: [
{ value: 'feat', name: 'feat: A new feature' },
{ value: 'fix', name: 'fix: A bug fix' },
// ... more types
],
// ... other configuration options
};
Lefthook:
pre-commit:
parallel: true
commands:
linter:
glob: "*.{js,ts}"
run: yarn eslint {staged_files}
tests:
run: yarn test
Key Differences
- cz-cli focuses on standardizing commit messages, while Lefthook is a more general-purpose git hooks manager
- Lefthook offers broader functionality for running various pre-commit and pre-push tasks
- cz-cli provides a guided interface for creating commits, whereas Lefthook automates checks and tasks before commits or pushes
- Lefthook has a YAML-based configuration, while cz-cli typically uses JavaScript for configuration
📓 Lint commit messages
Pros of commitlint
- Specialized focus on enforcing commit message conventions
- Extensive configuration options for custom commit message rules
- Integrates well with other conventional commit tools and workflows
Cons of commitlint
- Limited to commit message linting, lacks broader Git hook functionality
- Requires additional setup and tools for full Git hook management
- May have a steeper learning curve for complex rule configurations
Code Comparison
commitlint configuration example:
{
"extends": ["@commitlint/config-conventional"],
"rules": {
"type-enum": [2, "always", ["feat", "fix", "docs", "style", "refactor", "test", "chore"]]
}
}
Lefthook configuration example:
pre-commit:
commands:
lint:
glob: "*.{js,ts}"
run: npm run lint
commit-msg:
commands:
commitlint:
run: npx commitlint --edit {1}
While commitlint focuses solely on commit message linting, Lefthook provides a more comprehensive Git hooks management solution. commitlint excels in enforcing commit conventions but requires additional setup for other Git hooks. Lefthook offers a simpler, all-in-one approach to managing various Git hooks, including commit message linting when integrated with commitlint.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Lefthook
The fastest polyglot Git hooks manager out there
A Git hooks manager for Node.js, Ruby and many other types 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.
ð Read the introduction post
Install
With Go (>= 1.22):
go install github.com/evilmartians/lefthook@latest
With NPM:
npm install lefthook --save-dev
With Ruby:
gem install lefthook
Installation guide with more ways to install lefthook: apt, brew, winget, and others.
Usage
Configure your hooks, install them once and forget about it: rely on the magic underneath.
TL;DR
# 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 '...'
More details
- Configuration for
lefthook.yml
config options. - Usage for lefthook CLI options, supported ENVs, and usage tips.
- Discussions for questions, ideas, suggestions.
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|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 with Winget
- Install for Debian-based Linux
- Install for RPM-based Linux
- Install for Arch Linux
- Usage
- Configuration
Examples
Articles
- 5 cool (and surprising) ways to configure Lefthook for automation joy
- Lefthook: Knock your teamâs code back into shape
- Lefthook + Crystalball
- Keeping OSS documentation in check with docsify, Lefthook, and friends
- Automatically linting docker containers
- Smooth PostgreSQL upgrades in DockerDev environments with Lefthook
- Lefthook for React/React Native apps
Top Related Projects
A framework for managing and maintaining multi-language pre-commit hooks.
Git hooks made easy 🐶 woof!
A fully configurable and extendable Git hook manager
Fast and powerful Git hooks manager for any type of projects.
The commitizen command line utility. #BlackLivesMatter
📓 Lint commit messages
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot