Using Git Hooks To Run your Tests and/or Linter
If you’re looking to set up a simple way to run code before each
commit in a pre-commit
hook for a Javascript project, this
is how I did it.
Setup
Hooks don’t actually depend on anything other than git, but I’m using
vite
and yarn
in this project. It would work
the same with any build tool, and if you use npm
just
replace yarn [command]
with
npm run [command]
.
For the hook to work you need to write this code in
{YOUR_PROJECT_ROOT}/.git/hooks/pre-commit
. So to get
started write one of the following into your terminal from your project
root:
For vim: vim .git/hooks/pre-commit
For nano: nano .git/hooks/pre-commit
For VS Code: code .git/hooks/pre-commit
Or create and edit the file in whatever other way you like.
Code
#!/bin/bash
yarn lint
linting_result=$?
if [[ $linting_result -ne 0 ]]
then
echo "LINT FAILED!"
echo 'Please fix linting problems before committing.'
exit 1
fi
yarn test
test_result=$?
if [[ $test_result -ne 0 ]]
then
echo "TESTS FAILED!"
echo 'Please make sure tests pass before committing.'
exit 1
fi
The yarn test
and yarn lint
commands work
exactly the same as they do when called from the command line at the
root of my project.
I get the exit code and check to see if it equals zero here:
linting_result=$?
if [[ $linting_result -ne 0 ]]
if it doesn’t equal 0 (-ne 0
), I echo a message and exit
the bash code with another non-zero exit code,
then
echo "LINT FAILED!"
echo 'Please fix linting problems before committing.'
exit 1
fi
If either the tests or the linter fail they exit with a code of 1. But if it exits with a different code I’d like to know why, so I exit with anything non-zero and don’t let the commit go forward.
Next steps
All you need to do now is run
chmod +x .git/hooks/pre-commit
, to make the code
executable, and the code will run on every commit.
Check out the documentation and add
whatever other hooks you like. I run the same code on push as well using
the pre-push
hook for example