Git Hooks自动化配置咨询:提交信息校验与预提交检查方案问询
Git Hooks 需求实现方案及示例
1. 提交信息强制校验与条件标签配置
可以通过commit-msg钩子实现该需求,支持配置三选一的条件标签规则,校验不通过直接拦截提交,校验通过后可直接提取字段写入数据库。
实现步骤
- 进入项目
.git/hooks目录,将commit-msg.sample重命名为commit-msg,添加可执行权限:chmod +x commit-msg - 写入以下校验逻辑:
#!/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任务(推荐)
- 进入项目
.git/hooks目录,将pre-commit.sample重命名为pre-commit,添加可执行权限:chmod +x pre-commit - 写入以下逻辑:
#!/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实现后在钩子中触发:
- 项目中新增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); } }
- 配置Gradle将该模块打包为可执行jar包,在pre-commit钩子中执行:
#!/bin/sh java -jar ./hook-module/build/libs/custom-pre-commit-hook.jar exit $?
内容的提问来源于stack exchange,提问作者Java Tech
相关产品推荐
相关产品推荐

