Hook manager
git-hooks is currently at the stage of managing client-side hooks. It will support server-side hooks future.
git-hooks is a fork of icefox/git-hooks. The article “Managing Project, User, and Global git hooks” explains much of the purpose of using git-hooks.
Below, I will explain git-hooks as well as the new features in this fork.
pre-commit and commit-msg)contrib hooks in the source code.Run git hooks install to tell a git repo to use git-hooks.
Stop using git-hooks by git hooks uninstall.
List all scope of hooks by execute git hooks directly. See below for what scope is.
git-hooks tries to reduce hook copies by using symbolic links to manage them.
Take pre-commit hook as an example. When git triggers pre-commit, git-hooks routes the execution to:
githooks directory under the repo directory,~/.githooks directory under home directory, and git config --set --system hooks.global.These three directories are called project scope, user scope, and global scope.
project scope hooks reside under repo directory. Here’s an example layout:
some-project
└── githooks
├── commit-msg
│ └── check
│ └── check2
└── pre-commit
└── check
└── check2
When git triggers pre-commit, all hooks under githooks/pre-commit will be executed.
By project scope, we can add project-related hooks into version control, and separate them into multiple files.
user hooks reside in the user’s home directory under the name .githooks. It contains the same directory structure as project hooks. With user hooks, you can setup personal hooks for all your projects.
home
└── someuser
└── .githooks
├── commit-msg
│ └── check
│ └── check2
└── pre-commit
└── check
└── check2
global scope hooks is configured via hooks.global entry in git's system-wide configuration. It allows multiple users on the same machine to share hooks.
usr
└── local
└── share
└── githooks
├── commit-msg
│ └── check
│ └── check2
└── pre-commit
└── check
└── check2
Git's system configuration is usually found in /etc/gitconfig or /usr/local/etc/gitconfig.
Use git config --system --set hooks.global to setup your global hooks directory.
[hooks]
global = /usr/local/share/githooks
Wait a minute.... What if I want to have a hook for a particular project and particular user? It can't be added in version control, or into user scope directory.
The solution is semi scope. semi scope actually reside inside project scope,
some-project
└── githooks
├── .gitignore
├── _pre-commit
│ └── check
│ └── check2
├── commit-msg
│ └── check
│ └── check2
└── pre-commit
└── check
└── check2
Now, when git triggers pre-commit, all hooks under githooks/pre-commit and git-hooks/_pre-commit will be executed.
In order to setup hooks as user-related, .gitignore should be written as
_*
This is where git-hooks differs from icefox/git-hooks; it adds the feature of community hooks.
Let’s look at the pre-commit hook in project scope. When git triggers pre-commit, besides scanning githooks, git-hooks also read githooks.json.
For this example, the contents of githooks.json are:
{
"pre-commit": {
"github.com/git-hooks/contrib": [
"bashlint",
"jshint"
]
}
}In the JSON, hooks under the "pre-commit" field will be executed.
It’s organized as another git repository. The repository will be cloned into the ~/.githooks-contrib directory. (It will be created if it doesn't exist.)
See Community hooks for more info.
