You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git Hooks自动化配置咨询:提交信息校验与预提交检查方案问询

Git Hooks 需求实现方案及示例

1. 提交信息强制校验与条件标签配置

可以通过commit-msg钩子实现该需求,支持配置三选一的条件标签规则,校验不通过直接拦截提交,校验通过后可直接提取字段写入数据库。

实现步骤

  1. 进入项目.git/hooks目录,将commit-msg.sample重命名为commit-msg,添加可执行权限:chmod +x commit-msg
  2. 写入以下校验逻辑:
#!/bin/sh
COMMIT_MSG_CONTENT=$(cat $1)

# 校验*必填字段*是否存在
if ! echo "$COMMIT_MSG_CONTENT" | grep -q "FileName:"; then
    echo "❌ 提交失败:缺少必填字段 FileName,格式参考:FileName: UserController.java"
    exit 1
fi
if ! echo "$COMMIT_MSG_CONTENT" | grep -q "描述:"; then
    echo "❌ 提交失败:缺少必填字段 描述"
    exit 1
fi

# 校验三类标识至少选一个,且只能选一个
COUNT=0
echo "$COMMIT_MSG_CONTENT" | grep -q "userstory:" && COUNT=$((COUNT+1))
echo "$COMMIT_MSG_CONTENT" | grep -q "CR#:" && COUNT=$((COUNT+1))
echo "$COMMIT_MSG_CONTENT" | grep -q "defect#:" && COUNT=$((COUNT+1))

if [ $COUNT -eq 0 ]; then
    echo "❌ 提交失败:必须填写三类标识中的一种:userstory、CR#、defect#"
    echo "格式参考:userstory: US123 / CR#: CR456 / defect#: DEF789"
    exit 1
fi
if [ $COUNT -gt 1 ]; then
    echo "❌ 提交失败:三类标识只能填写一种,不可同时提交多个"
    exit 1
fi

# 此处可添加字段提取+写入数据库的逻辑,比如调用后端存储接口
exit 0

合规提交示例

FileName: OrderService.java
CR#: CR20240520003
描述: 修复订单超时取消逻辑的边界问题


2. Pre Commit Hook 实现静态代码检查与JUnit执行

可以使用Java编写对应Hook,也可以直接调用Gradle现有任务实现,后者更轻量易维护,两种方案示例如下:

方案一:直接调用Gradle任务(推荐)

  1. 进入项目.git/hooks目录,将pre-commit.sample重命名为pre-commit,添加可执行权限:chmod +x pre-commit
  2. 写入以下逻辑:
#!/bin/sh
# 执行静态代码检查,可替换为你项目使用的SpotBugs、PMD等工具对应的Gradle任务
./gradlew checkstyleMain checkstyleTest
if [ $? -ne 0 ]; then
    echo "❌ 提交失败:静态代码检查不通过,请修复告警后重试"
    exit 1
fi

# 执行JUnit单元测试,可加--tests参数仅执行改动文件关联的单测提升速度
./gradlew test
if [ $? -ne 0 ]; then
    echo "❌ 提交失败:单元测试执行不通过,请修复失败用例后重试"
    exit 1
fi

exit 0

方案二:Java编写Hook实现

如果需要自定义复杂检查逻辑,可以用Java实现后在钩子中触发:

  1. 项目中新增Hook模块,编写可执行类:
public class CustomPreCommitHook {
    public static void main(String[] args) throws Exception {
        // 执行静态代码检查逻辑,也可直接调用Checkstyle等工具的API实现自定义检查
        Process checkProcess = new ProcessBuilder("./gradlew", "checkstyleMain").start();
        int checkCode = checkProcess.waitFor();
        if (checkCode != 0) {
            System.err.println("静态代码检查不通过");
            System.exit(1);
        }

        // 执行JUnit单元测试,也可调用JUnit Platform API自定义执行规则
        Process testProcess = new ProcessBuilder("./gradlew", "test").start();
        int testCode = testProcess.waitFor();
        if (testCode != 0) {
            System.err.println("单元测试执行失败");
            System.exit(1);
        }

        System.exit(0);
    }
}
  1. 配置Gradle将该模块打包为可执行jar包,在pre-commit钩子中执行:
#!/bin/sh
java -jar ./hook-module/build/libs/custom-pre-commit-hook.jar
exit $?

内容的提问来源于stack exchange,提问作者Java Tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:48:05