Prevent commits to main/master with git hooks!

You can use git hooks to keep you safe when you aren't thinking properly and decide to commit something to main/master.

It would be nice if we could create a hook which would prevent commits to main/master unless we give it some override. Like a `crimesjohnson` prefix.

As a start I decided to make a global hook for all of my projects with this command:

`git config --global core.hooksPath ~/githooks`

I then created a file (within `~/githooks`) for a special kind of git hook and named it `commit-msg`.

```sh
#!/bin/sh

commit_msg=$(cat "${1:?Missing commit message file}")
branch="$(git rev-parse --abbrev-ref HEAD)"

if ([ "$branch" = "main" ] || [ "$branch" = "master" ]) && [[ "$commit_msg" != *"crimesjohnson:"* ]]; then
  echo "You can't commit directly to main/master branch"
  exit 1
fi
```

Don't forget to make it executable: `chmod +x ~/githooks/commit-msg`

When you create a commit message, it seems like the message is saved to a temp file while the `commit-msg` hook runs. We get the commit message by `cat`ing it.

We also use a git command to get the name of our branch.

Using these 2 bits of info, we can then write a simple if statement to keep us safe!

douglasgreyling
March 14, 2022