pre-commit中black的--include选项不生效 无法匹配非标准命名Python文件
核心逻辑说明
- pre-commit 调用钩子时,从来不会传目录路径,只会传入 本次提交暂存区里、匹配当前钩子文件筛选规则的文件路径列表。
- psf官方维护的black pre-commit钩子,默认内置了两层筛选:一是文件类型筛选,只识别被标记为
python类型的文件;二是路径匹配,默认只匹配.py后缀文件。你的MyFile没有.py后缀,根本不会被pre-commit加入传给black的文件列表,这就是你加了--include参数也完全没触发格式化的原因。 - 你在命令行测试到的black行为完全符合设计:当给black传入明确的文件路径作为参数时,它会直接跳过自身的
--include/--exclude正则过滤逻辑,直接处理所有传入的文件;只有传入目录路径时,它才会递归遍历目录,用include规则筛选目标文件。pre-commit的传参模式是传文件列表,所以在args里配置--include本身在pre-commit场景下没有任何作用。
正确配置方案
不需要给black传--include参数,直接在pre-commit的钩子配置层调整文件筛选规则,让pre-commit把你的非标准命名Python文件传给black即可,参考配置如下:
- repo: https://github.com/psf/black rev: 22.3.0 hooks: - id: black args: ["--preview"] # 关闭默认的文件类型校验,避免无后缀文件被类型规则拦截 types: [] # 配置需要传给black的文件路径正则,匹配.py后缀和你的目标文件 files: (\.py|MyFile)$
配置说明:
types: []表示关闭pre-commit默认的文件类型检测过滤,避免无.py后缀的文件因为被识别为其他类型(比如纯文本)被筛掉。files字段是pre-commit层面的路径正则匹配,会覆盖钩子默认的路径筛选规则,所有匹配该正则的暂存文件都会被加入传给black的文件列表。- black收到明确的文件路径后会直接执行格式化,不需要额外的include参数控制。
如果存在多个无后缀Python文件,直接在files的正则里追加即可,比如需要同时匹配名为BUILD、WORKSPACE的Python文件,可以写成files: (\.py|^MyFile$|^BUILD$|^WORKSPACE)$。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

