如何在pre-commit钩子的entry中执行带命令替换的golangci-lint命令?
解决pre-commit钩子中执行带命令替换的golangci-lint命令问题
直接在pre-commit的entry中写golangci-lint run --new-from-rev=$(git merge-base HEAD master) ./...不生效,是因为pre-commit默认会直接执行命令,不会通过shell解析$(...)这类shell语法,导致参数被原样传递给golangci-lint。以下是两种可行的解决方法:
方法一:通过shell包裹命令执行
将entry设置为调用shell并传递完整命令,让shell处理命令替换逻辑。在.pre-commit-config.yaml中配置local钩子:
- repo: local hooks: - id: golangci-lint-new-commits name: golangci-lint (仅检查新提交) entry: bash -c 'golangci-lint run --new-from-rev=$(git merge-base HEAD master) ./...' language: system types: [go]
这里用单引号包裹命令,既避免YAML解析冲突,又能让bash正确解析内部的命令替换。
方法二:使用独立脚本文件
如果命令逻辑较复杂,可创建一个单独的脚本文件来封装逻辑,更易维护:
- 创建脚本文件(比如
scripts/golangci-lint-hook.sh):
#!/bin/bash # 获取当前分支与master的共同祖先提交 MERGE_BASE=$(git merge-base HEAD master) # 执行golangci-lint检查 golangci-lint run --new-from-rev="$MERGE_BASE" ./...
- 给脚本添加执行权限:
chmod +x scripts/golangci-lint-hook.sh
- 在
.pre-commit-config.yaml中引用该脚本:
- repo: local hooks: - id: golangci-lint-new-commits name: golangci-lint (仅检查新提交) entry: ./scripts/golangci-lint-hook.sh language: system types: [go]
pre-commit本身没有内置处理git merge-base的专属功能,核心是通过shell环境来解析命令替换语法,让参数能正确被替换为实际的提交哈希。
内容的提问来源于stack exchange,提问作者Arxeiss
相关产品推荐
相关产品推荐

