用途:为多语言或 monorepo 仓库搭建 Git 钩子,使用 Lefthook(Go 编写的语言无关钩子管理器),目标是在仓库根目录用一份 lefthook.yml 统一驱动不同语言子树的检查。pre-commit 对暂存文件运行快速的格式化与 lint,pre-push 运行较慢的类型检查与测试,各语言通道可并行执行。它是本地“提交/推送前快速失败”层,补充而非替代 CI。
主要能力:单文件、单二进制、原生支持暂存文件过滤;commands 或 jobs 两种写法;glob 按语言过滤、root 切换命令工作目录、exclude 排除文件、stage_fixed 在 pre-commit 重新暂存自动修复结果;parallel 并行、piped 顺序执行;skip/only 条件;文件模板变量 {staged_files}、{push_files}、{all_files}、{files}、{cmd}。
使用方式:安装 Lefthook(如 npm install lefthook --save-dev,或 Homebrew、go install、pipx、gem、apt、snap、winget),运行 lefthook install 写入 .git/hooks;在根目录编写 lefthook.yml,用 min_version 固定主版本。新克隆仓库需通过 npm postinstall、prepare 脚本或文档说明执行 lefthook install 才能生效;pnpm 需将 lefthook 加入 onlyBuiltDependencies。CI 中可用 CI=true 跳过安装,LEFTHOOK=1 强制启用。
适用场景:多语言/单仓多包项目、从 husky+lint-staged 或 Python pre-commit 框架迁移、需要按子树限定工具范围的仓库。
限制:钩子位于本地 .git/hooks,可被 git commit --no-verify 或 LEFTHOOK=0 绕过,因此强制门禁应由 CI 承担;stage_fixed 仅 pre-commit 有效;root 不改变 glob 的匹配基准;无匹配文件时命令会被跳过;lefthook install 在 git worktree 中可能需重新执行。具体工具(Biome、Ruff、tsc、ty)的配置不在本技能范围内。