Michael Trojanek (relativkreativ) — Bootstrapper and creator of things

This article was published on July 1st 2014 and takes about 3 minutes to read.

Use it with caution — it is probably still valid, but it has not been updated for over a year.

Keeping your codebase healthy with git hooks

When developing on your own or in a small team, automation and code quality are crucial to stay agile. Git hooks are a cheap way to start optimizing.

Table of contents

  1. How to setup
  2. Technical details

git hooks are your friends. They are a snap to implement, can help you to keep your codebase healthy and may be your first step into Continous Integration.

Here is a hook that runs your entire test suite and prevents further actions if there are failing tests:

#! /bin/bash -l

BRANCH=$(git symbolic-ref HEAD|sed 's,refs/heads/,,')
[[ "${BRANCH}" != "master" ]] && exit 0

cd $( cd $(dirname $0); pwd -P )/../..

git stash -q --keep-index
bundle exec rake test &> /dev/null
git stash pop -q

if [[ $RESULT != 0 ]]; then
  echo "There are failing tests. Aborting." 1>&2
  exit 1

Before running your tests, it stashes untracked changes to ensure that only relevant code is considered. The stash is reapplied afterwards.

How to setup

It can be setup in two different ways:

Git hooks live under /path/to/project/.git/hooks but it is advisable to include custom hooks in your application's root directory and symlink them so other developers on your team can use them too (you may want to include these instructions in your project's README). Note that these scripts must be executable in order for git to run them.

To use the above script as a pre-commit hook (name it /path/to/project/pre-commit):

cd /path/to/project
chmod +x pre-commit
ln -s ./pre-commit .git/hooks/pre-commit

To use it as a pre-push hook (name it /path/to/project/pre-push):

cd /path/to/project
chmod +x pre-push
ln -s ./pre-push .git/hooks/pre-push

Technical details

Get in the loop!

Join my email list to get new articles delivered straight to your inbox.

No spam — guaranteed. You can leave at any time.