2.7 KiB
topic, source_keys
| topic | source_keys | ||
|---|---|---|---|
| overview |
|
What pre-commit is
Pre-commit is a framework for managing and executing git hooks. Hooks run automatically at specific git lifecycle points (pre-commit, pre-push, commit-msg, etc.) against staged or changed files. Each hook is pulled from a versioned external git repo; pre-commit clones and caches it in ~/.cache/pre-commit (or $PRE_COMMIT_HOME) and manages isolated execution environments per hook. No system-wide language runtimes are required for most hooks.
Key concepts
Config file: .pre-commit-config.yaml at the repo root. This is the single source of truth for all hooks.
Hook repos vs local hooks: Most hooks live in external git repos (pinned by rev). Local hooks (repo: local) live in the same repo and run system tools or scripts directly.
rev must be immutable: Always use a tag or commit SHA, never a branch. autoupdate will not work correctly with branches.
File targeting: Hooks receive only the files that match their files regex AND types filter. pre-commit run --all-files bypasses staging and runs against all files in the tree.
Staged files only by default: When run via git hooks, pre-commit passes only staged files. This means fixers (e.g. trailing-whitespace) modify files but the commit is blocked — the user must re-stage and recommit.
PRE_COMMIT=1 is set in the environment whenever a hook is executing (since v2.5.0). Hooks can use this to detect they are running under pre-commit.
identify library determines file types. Inspect what tags a file has with identify-cli <file>. Types include: file, text, binary, executable, python, json, yaml, shell, javascript, typescript, markdown, toml, xml, etc.
Mental model for a skill/agent
A pre-commit agent operates on three artefacts:
.pre-commit-config.yaml— the config it creates or modifies.pre-commit-hooks.yaml— a hook manifest if the agent is also authoring hooks in the repo- The git hooks in
.git/hooks/— installed bypre-commit install
The safe workflow for a skill:
- Write or modify
.pre-commit-config.yaml - Run
pre-commit validate-config— abort if non-zero - Run
pre-commit run --all-files— surface hook failures - Run
pre-commit autoupdateif updatingrevvalues - Run
pre-commit installonce to wire hooks into git
Cache and environment
Default cache: ~/.cache/pre-commit or $XDG_CACHE_HOME/pre-commit.
Override: export PRE_COMMIT_HOME=/path/to/cache.
Pre-create all environments: pre-commit install-hooks.
Wipe and rebuild: pre-commit clean.
Remove unused only: pre-commit gc.