A Git hook to validate your commit messages, based largely on Tim Pope's authoritative guide.
$ git commit
Adding a cool feature
foobar foobar foobar,
foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
1: Error: Message must use imperative present tense.
2: Error: Second line must be blank.
3: Error: Lines should be <= 72 chars. (76)
Force commit? [y/n] ▊
- Ruby >= 1.9
Install the gem:
$ gem install fit-commit
Install the hook in your Git repo:
$ fit-commit install
This creates a .git/hooks/commit-msg
script which will automatically check your Git commit messages.
- Line Length: All lines must be <= 72 chars (URLs excluded). First line should be <= 50 chars. Second line must be blank.
- Tense: Message must use imperative present tense: "Fix bug" and not "Fixed bug" or "Fixes bug."
- Summary Period: Do not end your summary with a period.
- WIP: Do not commit WIPs to shared branches.
- Frat House: No frat house commit messages in shared branches.
Settings are read from these files in increasing precedence: /etc/fit_commit.yml
, $HOME/.fit_commit.yml
, config/fit_commit.yml
, ./.fit_commit.yml
.
These are the default settings that can be overridden:
---
Validators/LineLength:
Enabled: true
MaxLineLength: 72
SummaryWarnLength: 50
AllowLongUrls: true
Validators/Tense:
Enabled: true
Validators/SummaryPeriod:
Enabled: true
Validators/Wip:
Enabled:
- master
Validators/Frathouse:
Enabled:
- master
The Enabled
property accepts multiple formats:
# true/false to enable/disable the validation (branch agnostic)
Validators/Foo:
Enabled: false
# Array of String/Regex matching each branch for which it's enabled
Validators/Bar:
Enabled:
- master
- !ruby/regexp /\Afoo.+bar/
First set your global Git template directory:
$ git config --global init.templatedir '~/.git_template'
$ mkdir -p ~/.git_template/hooks
Now you can copy the hooks you want installed in new repos by default:
# From a repo where Fit Commit is already installed
$ cp .git/hooks/commit-msg ~/.git_template/hooks/commit-msg
To copy your default hooks into existing repos:
$ git init
Fit Commit aims to be useful to everyone. If you can suggest an improvement to make it useful to more people, please open a GitHub Issue or Pull Request.
Author: Mike Foley
Inspiration taken from: Tim Pope, Jason Fox, Addam Hardy, pre-commit