Summary

A practical guide to advanced pre-commit configurations for Python teams: centralized shared config across monorepos, explicit version pinning, auto-fix modes, additional_dependencies for plugin customization, per-file-type hook targeting, CI integration, custom local hooks, and performance tuning with parallel execution and caching. Aimed at senior developers standardizing team-wide code quality.

Python 團隊的進階 pre-commit 配置實踐指南:集中共享配置、明確版本釘定、自動修復模式、additional_dependencies 插件自定義、按文件類型的鉤子目標、CI 整合、自定義本地鉤子,以及並行執行和緩存的性能調整。

Key Points

  • Centralized config: maintain one .pre-commit-config.yaml in a shared repo, symlink or distribute it via cookiecutter/setup scripts — ensures consistency across microservices
  • Always pin rev:: never use rev: master — breaks CI when upstream changes. Pin to exact version tags (e.g., rev: 6.1.0)
  • Auto-fix in pipeline: black --fast, isort, pyupgrade, autoflake, ruff in auto-fix mode — reduce friction by having hooks fix problems rather than just report them
  • additional_dependencies: inject specific plugin versions (e.g., flake8-bugbear, pep8-naming) directly into hook environments without separate installs
  • File-type targeting: types: [python] or files: \.py$ restricts hooks to relevant files, speeding up mixed-language repos
  • CI integration: pre-commit run --all-files in CI catches what developers skip locally; --show-diff-on-failure makes failures actionable
  • Performance: --parallel flag for independent hooks; cache stored in ~/.cache/pre-commit — warm cache makes hooks near-instant

Insights

The most high-leverage tip is centralized config: without it, each repo drifts to its own version of “pre-commit” and onboarding becomes a support burden. Symlink from a shared config repo and update it in one place. The second most valuable: auto-fix mode. Having hooks fix formatting rather than fail the commit removes the “pre-commit as annoyance” perception and makes adoption friction-free.

Connections

Raw Excerpt

Use centralized shared configuration to ensure consistency across microservices or projects. Pin hook versions explicitly — never use rev: master.