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