Golang运行pre-commit hook报named files must be .go files错误
问题原因
你的配置存在三个问题,导致钩子执行逻辑和你手动在终端运行命令不一致:
- 缺少
pass_filenames: false配置:pre-commit默认会把所有匹配规则的文件路径追加到你写的entry命令末尾,你定义的命令实际执行时会变成staticcheck -tests=false ./... [文件1路径] [文件2路径]...,这些自动追加的文件路径就是报错的直接来源。 types: [text]匹配规则错误:这个规则会命中仓库内所有文本类型文件,包括yaml、markdown、各类配置文件等非Go后缀的文件,staticcheck只接受.go后缀的文件作为入参,遇到这些非Go文件就会抛出named files must be .go files的报错,你看到多行重复报错,就是因为每匹配到一个非Go文件就会触发一次报错提示。language: golang配置不符合预期:这个配置会让pre-commit在独立的隔离环境中运行Go程序,不会调用你本地终端已经装好的staticcheck,和你手动执行命令的环境不统一。
修复方案
如果你要复用本地已经安装好的staticcheck,保持和手动执行命令完全一致的行为,把.pre-commit-config.yaml里的对应配置改成如下内容即可:
repos: - repo: local hooks: - id: static-checks-pramod name: Static Analysis description: This hook does static analysis entry: staticcheck -tests=false ./... language: system types: [go] pass_filenames: false
改动点说明:
- 将
language从golang改为system:直接调用本地系统环境中安装的staticcheck,和你手动在终端执行命令的环境完全一致。 - 将
types从[text]改为[go]:仅匹配Go源码文件,过滤掉所有无关类型的文件。 - 新增
pass_filenames: false:禁止pre-commit自动往命令末尾追加文件路径,完全按照你定义的entry命令执行,不会出现多余参数。
修改完成后重新执行pre-commit run --all-files即可正常运行。
内容的提问来源于stack exchange,提问作者pramod
相关产品推荐
相关产品推荐

