--- title: "Git Tips - Lint + Test Pre-commit Hook" date: 2020-01-01T21:00:39Z tags: [git, bash] --- One of my favorite inventions is a `pre-commit` hook that auto runs test and lint commands from a `makefile` or `package.json` if they're found: ```bash {linenos=table} #!/usr/bin/env bash if [ -f "$PWD/makefile" ] && [ ! -z "$(cat $PWD/makefile | grep '^lint:')" ]; then echo "running make lint" make lint elif [ -f "$PWD/package.json" ] && [ ! -z "$(cat $PWD/package.json | grep "^\"lint\":")" ]; then echo "running npm run lint" npm run lint fi if [ -f "$PWD/makefile" ] && [ ! -z "$(cat $PWD/makefile | grep '^test:')" ]; then echo "running make test" make test elif [ -f "$PWD/package.json" ] && [ ! -z "$(cat $PWD/package.json | grep "^\"test\":")" ]; then echo "running npm run test" npm run test fi ``` The `/usr/bin/env bash` piece ensures that the script has access to all of the environment variables you expect in your regular shell. If the test or lint command fails then the `git commit` command fails. If I absolutely need to commit something in spite of the lint/test results I can do `git commit --no-verify` to skip the `pre-commit` hook.