Git Hooks

Git hook locations, setup patterns, and reusable client-side hook snippets for linting, testing, policy, and automation.

View
StandardDetailedCompact
Export
Copy the compact sheet, download it, or print it.
Download
`D` dense toggle · `C` copy all

Client-Side Hooks

Hooks executed during local developer workflows.

Pre-commit hook path

Default path for pre-commit hook script.

shANYhookspre-commit
bash
.git/hooks/pre-commit

Commit-msg hook path

Default path for commit-msg hook script.

shANYhookscommit-msg
bash
.git/hooks/commit-msg

Pre-push hook path

Default path for pre-push hook script.

shANYhookspre-push
bash
.git/hooks/pre-push

Make hook executable

Hooks must be executable to run.

bashANYhookspermissions
bash
chmod +x .git/hooks/pre-commit

Use centralized hooks path

Store hooks in a versioned directory.

bashANYhooksconfig
bash
git config core.hooksPath .githooks

Hook Snippets

Practical scripts users often search for and adapt.

Pre-commit lint script

Run linting before commit and fail on error.

shANYhookspre-commitlint
bash
#!/usr/bin/env sh
npm run lint

Pre-commit test script

Run tests before commit.

shANYhookspre-committest
bash
#!/usr/bin/env sh
npm test

Commit-msg conventional commits validator

Reject non-conforming commit messages.

shANYhookscommit-msgconventional-commits
bash
#!/usr/bin/env sh
grep -Eq "^(feat|fix|docs|chore|refactor|test)(\(.+\))?: .+" "$1"

Block direct pushes to main

Prevent accidental pushes to main.

shANYhookspre-pushpolicy
bash
#!/usr/bin/env sh
branch="$(git symbolic-ref --short HEAD)"
[ "$branch" = "main" ] && echo "Direct pushes to main are blocked." && exit 1
exit 0

Post-checkout regenerate assets

Run setup after checkout when needed.

shANYhookspost-checkout
bash
#!/usr/bin/env sh
npm install

Hook Lifecycle Commands

Commands and patterns used while developing or debugging hooks.

Show hooksPath

See whether Git uses a non-default hook directory.

bashANYhooksinspect
bash
git config --show-origin --get core.hooksPath

Skip client hooks for one commit

Bypass pre-commit and commit-msg hooks when necessary.

bashANYhooksbypassdanger
bash
git commit --no-verify -m "Emergency commit"

Skip pre-push hook

Bypass pre-push hook for one push.

bashANYhooksbypassdanger
bash
git push --no-verify

Debug shell hook with xtrace

Trace shell execution for debugging.

shANYhooksdebug
bash
set -x
# add near top of hook script