使用pre-commit run -a时检查未遍历所有文件的问题排查
问题分析与解决方案
核心问题定位
你遇到的pre-commit run -a -v检查范围随机、未遍历所有目标文件的问题,大概率是hook配置中的files正则匹配规则不准确导致的,其次可能和pre-commit缓存或脚本逻辑有关。
具体原因分析
files正则匹配逻辑偏差
你当前配置的files: 'team/.*/'和files: 'articles/.*/'是匹配路径中包含team/xxx/或articles/xxx/的字符串,但pre-commit的files规则是用来匹配文件的完整相对路径,这种写法会导致:- 无法精确锁定子目录下的
.md文件,导致pre-commit筛选文件时出现随机遗漏 - 可能误匹配包含该模式的非目标文件
- 无法精确锁定子目录下的
缓存干扰
pre-commit会缓存hook的执行上下文,旧的缓存可能导致文件筛选逻辑异常,出现随机结果。
解决方案
1. 修正files正则匹配规则
将.pre-commit-hooks.yaml中的files字段改为精确匹配目标文件的正则:
- id: team-check-name name: blabla description: blabla entry: team-checkname files: ^team/.*\.md$ # 匹配team目录下所有子目录中的.md文件 types: [markdown] language: python - id: article-check-name name: blabla description: blabla entry: article-checkname files: ^articles/.*\.md$ # 匹配articles目录下所有子目录中的.md文件 types: [markdown] language: python
^锚定路径开头,.*匹配任意子目录层级,\.md$锁定markdown文件后缀,确保只筛选目标文件。
2. 清除pre-commit缓存
执行以下命令清除缓存,避免旧上下文干扰:
pre-commit clean
3. 验证hook脚本逻辑
检查你的team-checkname和article-checkname脚本,确保:
- 脚本接收所有传入的文件参数(即
sys.argv[1:]) - 没有随机跳过文件、或仅处理部分文件的逻辑
- 输出内容能正确对应所有被检查的文件
4. 确认git追踪状态
确保所有目标.md文件都已被git追踪(执行git add articles/ team/),因为pre-commit run -a仅处理已被git追踪的文件。
验证
修改完成后,重新运行:
pre-commit run -a -v
此时应该能看到所有目标文件都被检查,且结果稳定。
内容的提问来源于stack exchange,提问作者ExalFabu
相关产品推荐
相关产品推荐

