Git hooks are an easy way to have scripts execute based on specific events. Since this is just a simple introductory, we’ll only concern ourselves with a few hooks. Your scripts can do anything you imagine, just keep in mind that only a non-zero return status will stop the Git procedure from continuing.

  • pre-commit
    • Called before your commit is written.
  • pre-receive
    • Called before your push is accepted.
  • post-commit
    • Called after your commit is written.
  • post-receive
    • Called after your push is accepted.

Lets walk through an example. Pretend we have some small project with a few developers and we decided that we’ll set up some linting standards, to ensure the code base is formatted the same. We have a few options we could take:

  1. We trust our developers to run the linter before committing and pushing
  2. We use CICD to run our linting, which can block pull requests from merging
  3. We tap into git hooks to ensure all pushes are linted properly

For the sake of this dialogue, lets argue that option 3 above is the best solution for our team. We could look at the four events above and pick one that would work best for our developers. I’d pitch that we’d be choosing between pre-commit and pre-receive.

If we were to use pre-commit, our linter would run every time our developer committed. Depending on the team, this may be considered a hassle, as the developers would have to satisfy the linter every time they commit. While the git history would always be clean, lets pretend like this would prove to be a hassle and result in our developers committing less often, which is a bad thing. That leaves us with pre-receive, which would allow our devs to commit to their heart’s desire and only have to satisfy the linter upon pushing.

So how do we actual create our pre-receive hook? Excellent question Greg. Inside the .git folder in your project will be a hooks folder. If you were to list that directory, you’ll see the following and more:

- pre-commit.sample
- pre-receive.sample

Each of these files is a sample commit. So for our sake, all we have to do is create a pre-commit file and write our logic in there. Here’s an example

# do some linting
# return 0 if success, else some non 0 number

Now all we have to do is ensure our pre-commit file is executable and we’re all set!

$ chmod +x pre-commit

In the future we’ll look at how to share these git hooks with our team mates!

As always, please reach out to me with any questions comments and feedback!