当前位置: 首页 > news >正文

Git 钩子:特定操作脚本

Git 钩子

  • 特定 Git 操作发生时自动触发脚本

  • 可以从提交规范、代码质量、自动化流程、分支管理、安全性检查等多个方面进行配置,帮助团队提高开发效率和代码质量;

本地

记录提交检验
  • commit-msg

  • 修改:\test\.git\hooks\commit-msg.sample\test\.git\hooks\commit-msg

  • 设置可执行权限:chmod +x \test\.git\hooks\commit-msg

#!/bin/bash
# 获取提交信息文件路径
commit_msg_file=$1
commit_msg=$(cat "$commit_msg_file")
# 定义提交信息格式的正则表达式
commit_regex="^(revert: )?(create|fixed|added|chore|refactor|hotfix|revert|update|build|test|save)($.+$)? - .{1,50}$"
​
warn() {
    echo -e "\033[41;37m $1 \033[0m \033[1;31m $2 \033[0m"
}
​
red() {
    echo -e "\033[31m$1\033[0m"
}
​
green() {
    echo -e "\033[32m$1\033[0m"
}
​
yellow() {
    echo -e "\033[33m$1\033[0m"
}
​
cyan() {
    echo -e "\033[34m$1\033[0m"
}
​
link() {
    echo -e "\033[4;34m$1\033[0m"
}
​
# 验证提交信息是否符合格式
if [[ ! $commit_msg =~ $commit_regex ]]; then
    # 输出错误信息
    echo
    warn "ERROR","无效的 commit 提交格式"
    echo
    echo -e "\033[31m请遵循以下正确的格式提交。例如:\033[0m"
    echo -e "\033[4;31mgit commit -m \"feat: 完成详情\"\033[0m"
    echo
    echo -e "\033[32m以下是一些示例:\033[0m"
    echo
    echo "+--------+-------------------+---------------------------+"
    printf "| %s\t | %-16s\t | %-24s\t |\n" "索引" "注释" "contect"
    echo "+--------+-------------------+---------------------------+"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "0" "新建项目" "create - 创建 XXX"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "1" "修复异常" "fixed - XXX bug"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "2" "新增特性" "added - 特性 XXX"
    printf "| %-4s\t | %-20s\t | %-28s\t |\n" "3" "构建新流程" "chore - 同步分支"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "4" "模块重构" "refactor - XXX"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "5" "紧急修复" "hotfix - XXX bug"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "6" "版本回滚" "revert - V1.0.1.0"
    printf "| %-4s\t | %-20s\t | %-28s\t |\n" "7" "更新文档" "update - 更新记录"
    printf "| %-4s\t | %-20s\t | %-28s\t |\n" "8" "项目打包" "build - 运行环境"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "9" "调试测试" "test - 测试 XXX"
    printf "| %-4s\t | %-20s\t | %-24s\t |\n" "10" "保存进度" "save - 暂存 XXXX"
    echo "+--------+-------------------+---------------------------+"
    echo
    red "描述:文字描述不得超过 50 个字符,推荐以动词开头:创建、修复、完成、修改、增加、更新等。"
    echo
    echo -e "更多详情请参考:"
    link "https://blog.csdn.net/weixin_43718346"
    echo
    exit 1
fi
​
#echo "+--------+-----------------------+-------------------------------+"
#printf "| %-8s | %s\t\t\t | %s\t\t\t |\n" "索引" "注释" "contect"
#echo "+--------+-----------------------+-------------------------------+"
#printf "| %-6s | %s\t\t | %s\t |\n" "0" "新建项目" "create - 创建 XXX 项目"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "1" "修复 bug" "fixed - 修复 XXX bug"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "2" "新增特性" "added - 新增特性 XXX"
#printf "| %-6s | %s\t\t | %s\t |\n" "3" "改变构建流程" "chore - 同步[分支名称]"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "4" "重构内容" "refactor - 重构 XXX"
#printf "| %-6s | %s\t\t | %s\t |\n" "5" "紧急修复" "hotfix - 紧急修复 XXX"
#printf "| %-6s | %s\t\t | %s\t |\n" "6" "版本回滚" "revert - 回滚 XXX 版本"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "7" "更新文档" "update - 更新文档"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "8" "打包项目" "build - 打包 XXX"
#printf "| %-6s | %s\t\t | %s\t\t |\n" "9" "测试文件" "test - 测试 XXX"
#printf "| %-6s | %s\t | %s\t\t |\n" "10" "暂存文件(保存进度)" "save - 暂存 XXXX"
#echo "+--------+-----------------------+-------------------------------+"
​
exit 0

服务器

提交检验
  • pre-receive

  • 修改:\test\.git\hooks\pre-receive.sample\test\.git\hooks\pre-receive

  • 设置可执行权限:chmod +x \test\.git\hooks\pre-receive

#!/bin/bash
​
warn() {
    echo -e "\033[41;37m $1 \033[0m \033[1;31m $2 \033[0m"
}
​
red() {
    echo -e "\033[31m$1\033[0m"
}
​
green() {
    echo -e "\033[32m$1\033[0m"
}
​
yellow() {
    echo -e "\033[33m$1\033[0m"
}
​
cyan() {
    echo -e "\033[34m$1\033[0m"
}
​
link() {
    echo -e "\033[4;34m$1\033[0m"
}
​
while read oldrev newrev refname; do
​
    # 获取推送的用户名
    username=$(git log -1 --pretty=format:%an $newrev)
    # # 定义允许操作的用户列表
    # allowed_users=("user1" "user2" "user3")
    # if [[ ! " ${allowed_users[@]} " =~ " ${username} " ]]; then
        # echo "错误: 用户 '$username' 没有操作权限。"
        # exit 1
    # fi
    
     # # 获取推送的邮箱
    # email=$(git log -1 --pretty=format:%ae $new_value)
    # # 定义邮箱规则的正则表达式(必须以 @hanslaser.com 结尾)
    # email_re="@hanslaser\.com$"
    # # 验证邮箱是否符合规则
    # if [[ ! $email =~ $email_re ]]; then
        # echo "错误: 邮箱 '$email' 必须以 @hanslaser.com 结尾。"
        # exit 1
    # fi
    
    # # 定义命名规则的正则表达式(英文名+数字工号,且工号不超过6位)
    # regex="^[a-zA-Z]+[0-9]{1,6}$"
    # # 验证用户名是否符合规则
    # if [[ ! $username =~ $regex ]]; then
        # echo "错误: 用户名 '$username' 必须为英文名+数字工号,且工号不超过6位。"
        # exit 1
    # fi
    
    # if [[ $refname != "refs/heads/main" ]]; then
        # echo "错误: 禁止创建新的分支!"
        # exit 1
    # fi
    
done
exit 0

相关文章:

  • 深入掌握Spring AOP:从原理到实战的完整指南
  • 在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败
  • cocos creator 笔记-路边花草
  • java8循环解压zip文件---实现Excel文件数据追加
  • 慧通测控汽车智能座舱测试技术
  • k8s基础知识总结node+pod(上)
  • CSS语言的双向链表
  • 4、pytest常用插件
  • word中指定页面开始添加页码
  • Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
  • Java设计模式之访问者模式
  • 计算机网络 - OSI 七层模型
  • 笔记:分享如何使用github静态页面搭建个人页面
  • 【2025】基于springboot+uniapp的企业培训打卡小程序设计与实现(源码、万字文档、图文修改、调试答疑)
  • 专访成都昭音科技Jackal:AI内容营销助力中企走向全球
  • 鸿蒙学习笔记(2)-国际化配置、ArkTS简述
  • 【Javaweb】b站黑马视频学习笔记(导览)
  • 多模态大模型Qwen 和 Qwen2 的模型结构、训练方式与数据处理对比分析
  • 安卓应用兼容新方案:Android Translation Layer(ATL)
  • 抽奖的诱惑系统注册与登录功能测试报告
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?
  • 雅安市纪委监委回应黄杨钿甜耳环事件:相关政府部门正在处理
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二
  • 总奖金池百万!澎湃与七猫非虚构写作与现实题材征文大赛征稿启动
  • 证券时报:中美互降关税落地,订单集中补发港口将迎高峰期
  • 上海市重大工程一季度开局良好,崇明线等按既定计划加快建设