如何配置pre-commit clang-format跳过.js文件并仅处理指定后缀文件?
问题:限制pre-commit的clang-format钩子仅处理指定后缀的文件
背景
我当前使用的pre-commit钩子配置如下:
repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: v14.0.6 hooks: - id: clang-format
原本预期pre-commit会自动跳过非CPP文件,但实际出现了钩子尝试格式化大量.js文件,导致代码混乱的情况。现在需要让该钩子仅处理指定后缀的文件,比如.c/.cpp/.h/.hpp/.cxx等。
疑问点
pre-commit提供了files参数,但存在以下困惑:
- 该参数是否为正则表达式
- 参数应放置在哪个层级(嵌套在clang-format的hooks条目下?与hooks同级?还是顶层repos节点下?)
- 我写出的以下配置是否正确?
repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: v14.0.6 hooks: - id: clang-format files: '(some regex here)'
解决方案
1. files参数的正确位置
files参数必须嵌套在对应的hook条目下,也就是和id同级。你上面的配置是错误的——files被放在了hooks数组之外的repo层级,无法生效。
2. files参数的规则
files的值是正则表达式,用于匹配需要处理的文件路径。注意:
- 正则会匹配文件路径的部分内容,若仅针对后缀匹配,需明确写规则限定结尾
- 正则默认不区分大小写,可通过
flags: (?i)修改,一般场景无需调整
3. 正确配置示例
针对C/C++相关后缀的文件,正确配置如下:
repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: v14.0.6 hooks: - id: clang-format files: '\.(c|cpp|h|hpp|cxx|hxx)$'
规则解释:
\.转义匹配文件后缀的开头点号c|cpp|h|hpp|cxx|hxx枚举需要处理的文件后缀$匹配字符串结尾,确保仅匹配以指定后缀收尾的文件
额外补充
如果需要排除特定文件,可配合exclude参数(同样放在hook条目下),比如排除第三方库文件:
repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: v14.0.6 hooks: - id: clang-format files: '\.(c|cpp|h|hpp|cxx|hxx)$' exclude: 'third_party/'
内容的提问来源于stack exchange,提问作者Tyler Shellberg
相关产品推荐
相关产品推荐

