Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > golang Git Hook自动化

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 时执行的检查

工作流程

六、团队同步最佳实践

无论选择哪种方案,核心问题都是 如何让团队成员自动安装 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自动化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文