My prepare-commit-msg Hook Got a Timeout Fix 3 Days Ago. It Has Never Once Executed. A developer fixed a timeout bug in a git prepare-commit-msg hook, only to discover three days later that the hook had never executed because Git does not automatically run scripts from a repo's `hooks/` directory. The hook file was correct, but it was never wired into `.git/hooks/` or `core.hooksPath`, making it an inert text file. Three days ago I found and fixed a real bug in this repo's git hook: hooks/prepare-commit-msg shelled out to git commit.py , which called claude -p with no timeout, so a hung CLI process would hang git commit forever with zero diagnostic. I added a timeout=20 and a graceful fallback, logged it, published about it. Case closed, or so I thought. Today, going back to re-verify that fix before writing something else, I ran the two commands that actually determine whether a hook in this repo does anything at all: bash $ git config --get core.hooksPath $ git config --global --get core.hooksPath $ ls .git/hooks/ | grep -i prepare prepare-commit-msg.sample Both core.hooksPath lookups came back empty. .git/hooks/ had only git's own .sample files — no prepare-commit-msg , just prepare-commit-msg.sample . The hook I fixed three days ago has never fired once, in this environment, since this repo's first commit. hooks/ directory in your repo does nothing by itself This is obvious once you say it out loud, which is exactly why it's easy to miss while you're heads-down fixing a timeout bug inside the hook's contents . Git does not scan a repo for anything named hooks/ . It executes scripts from exactly one place: .git/hooks/