Version Control Git Hooks with npm Scripts

There are lots of great primers on Git hooks out there, so if you’re new to the concept, take a little time to get comfortable first; we’ll get straight to the point here.

The Problem

By default, Git stores client-side hooks in .git/hooks which is outside of version control. While packages like Husky are available to make creating and versioning hooks easy, I found the setup process for the newest version too close to a “roll your own” method to justify learning yet another CLI.

The Solution

Create a directory at the project root to contain the hooks. I prefer to keep mine at ./scripts/git/hooks, but you can choose whatever path best fits the project’s file structure.

Git provides a configurable setting called hooksPath in the core table of the .git/config file and commands to set and unset it. In package.json add:

  "scripts": {
    "hooks:install": "git config core.hooksPath ./scripts/git/hooks",
    "hooks:uninstall": "git config --unset"

And that’s it! After running the hooks:install script, Git recognizes valid client-side hooks in ./scripts/git/hooks and more importantly, they are version controlled.

Optionally, you can include npm run hooks:install in a separate bootstrap script to combine and run any all of the processes needed to bootstrap a project.

There are certainly other methods for achieving this behavior, but this solution felt particularly elegant to me. Hope it’s useful and as always, feel free to point out any edge cases or your own preferred solution.