golang Git Hook自动化实现的示例代码
作者:尼克
本文主要介绍了golang Git Hook自动化实现的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Go 语言实现 Git Hook 自动化主要有三种主流方案,从原生 Shell 脚本到 Go 原生工具链,各有适用场景:
一、方案对比
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 原生 Shell Hook | 个人/小团队快速上手 | 零依赖,直接生效 | 不可版本控制,团队难同步 |
| Lefthook (Go 原生) | Go 项目/多语言团队 | 并行执行、YAML 配置、Go 生态原生 | 需额外安装 |
| pre-commit (Python) | 跨语言统一规范 | 生态丰富、社区成熟 | 依赖 Python 环境 |
| simple-pre-commit (Go) | 轻量 Go 项目 | 基于 Makefile,极简 | 功能较简单 |
二、方案一:原生 Shell Hook(快速入门)
在项目 .git/hooks 目录下创建 pre-commit 脚本:
#!/bin/sh
# .git/hooks/pre-commit
echo "🔍 正在执行代码检查..."
# 1. 格式化检查
gofmt -s -w .
if [ $? -ne 0 ]; then
echo "❌ gofmt 格式化失败"
exit 1
fi
# 2. 运行 golangci-lint
golangci-lint run --fast
if [ $? -ne 0 ]; then
echo "❌ golangci-lint 检查未通过"
exit 1
fi
# 3. 运行测试
go test -race ./...
if [ $? -ne 0 ]; then
echo "❌ 测试未通过"
exit 1
fi
echo "✅ 检查通过,允许提交"赋予执行权限:
chmod +x .git/hooks/pre-commit
⚠️ 注意:.git/hooks 目录不会被 Git 跟踪,团队成员需要手动复制。可以通过 Makefile 或 go generate 自动化安装。
三、方案二:Lefthook(Go 项目推荐)
Lefthook 是用 Go 编写的高性能 Git Hook 管理器,支持并行执行和 YAML 配置。
安装
# Go install go install github.com/evilmartians/lefthook@latest # 或 Homebrew brew install lefthook
初始化配置
lefthook install
配置文件 lefthook.yml
# lefthook.yml
pre-commit:
parallel: true # 并行执行,加速检查
commands:
go-fmt:
glob: "*.go"
run: gofmt -s -w {staged_files}
go-vet:
glob: "*.go"
run: go vet ./...
golangci-lint:
glob: "*.go"
run: golangci-lint run --fast
go-test:
run: go test -race -count=1 ./...
pre-push:
commands:
go-test-all:
run: go test -race -count=1 ./...
go-build:
run: go build -o /dev/null ./...
commit-msg:
commands:
commitlint:
run: commitlint --edit {1}常用命令
lefthook run pre-commit # 手动触发 pre-commit lefthook run pre-push # 手动触发 pre-push LEFTHOOK=0 git commit # 跳过所有 hooks(紧急修复)
四、方案三:pre-commit(跨语言生态)
pre-commit 是 Python 生态的 Hook 管理框架,Go 项目也可使用。
安装
pip install pre-commit
配置文件 .pre-commit-config.yaml
# .pre-commit-config.yaml
repos:
# Go 基础检查
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
args: ['--maxkb=500']
# golangci-lint
- repo: https://github.com/golangci/golangci-lint
rev: v1.64.0
hooks:
- id: golangci-lint
args: ["--fast"]
# Go 格式化
- repo: https://github.com/dnephin/pre-commit-golang
rev: v0.5.1
hooks:
- id: go-fmt
- id: go-vet
- id: go-imports
- id: go-critic
- id: go-unit-tests安装与使用
pre-commit install # 安装 hooks pre-commit run --all-files # 手动全量检查 git commit --no-verify # 跳过 hooks
五、方案四:simple-pre-commit(极简 Go 方案)
基于 Makefile 的轻量级方案,适合小型 Go 项目:
Makefile
.PHONY: install test lint pre-commit install: go mod tidy go install github.com/brenner8023/simple-pre-commit@latest simple-pre-commit # 自动注入 .git/hooks/pre-commit test: go test -race -v ./... lint: golangci-lint run --fast pre-commit: lint test # pre-commit 时执行的检查
工作流程
- 新成员克隆仓库后执行 make install
- simple-pre-commit 自动将 make pre-commit 注入到 .git/hooks/pre-commit
- 每次 git commit 自动触发 make pre-commit
六、团队同步最佳实践
无论选择哪种方案,核心问题都是 如何让团队成员自动安装 Hook:
方式 1:Makefile 入口
.PHONY: setup setup: go mod tidy lefthook install # 或 pre-commit install go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
方式 2:Go 工具链(go:generate)
// tools.go
//go:build tools
// +build tools
package tools
import (
_ "github.com/evilmartians/lefthook" // go:generate lefthook install
)go generate ./...
方式 3:README 强制引导
## 开发环境初始化 make setup # 必须执行,安装 git hooks 和依赖工具
到此这篇关于golang Git Hook自动化实现的示例代码的文章就介绍到这了,更多相关golang Git Hook自动化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
