如何配置pre-commit在前序钩子执行失败时终止后续钩子运行?
pre-commit 顺序执行钩子配置方案
pre-commit原生支持该需求,可通过以下两种方式实现:
方案1:全局快速失败配置(推荐,适配绝大多数场景)
在pre-commit-config.yml的顶层添加fail_fast: true配置即可,该配置的作用为:任意钩子执行失败时立刻终止整个pre-commit流程,不会运行后续钩子。
你遇到的格式化钩子修改文件后返回非0退出码属于pre-commit格式化类钩子的标准行为(提示用户文件已被修改,需重新暂存提交),配置该参数后会直接终止流程,不会运行后续的pytest钩子,避免无意义的耗时。
配置示例如下:
fail_fast: true repos: - repo: <格式化钩子对应的仓库地址> rev: <对应版本号> hooks: - id: <格式化钩子id,例如black、prettier等> - repo: <pytest钩子对应的仓库地址/本地钩子配置> hooks: - id: pytest # 你的pytest钩子原有配置保持不变
方案2:局部钩子依赖配置(适合不需要全局开启快速失败的场景)
如果你还有其他钩子需要即使前置钩子失败也要运行,可以将两个钩子的执行逻辑封装为同一个本地钩子,按顺序执行,只有前一步返回码为0时才执行后续步骤:
repos: - repo: local hooks: - id: format-and-test name: 格式化 + 单测执行 entry: bash -c 'pre-commit run <格式化钩子id> --files "$@" && pytest' -- language: system pass_filenames: true # 其他参数按需配置即可
补充说明
配置上述方案后可完全规避pytest重复执行的问题,提交阶段耗时可降低约50%。
内容的提问来源于stack exchange,提问作者Mark C.
相关产品推荐
相关产品推荐

