钩子
1.介绍
Git钩子是嵌入在Git中的一系列可执行脚本,在特定Git操作执行前后触发,类似于触发器的角色。它用于实现自动化任务、执行自定义验证及工作流扩展,例如在提交前运行代码质量检查、推送后自动部署。常见场景涵盖代码校验、测试、邮件通知、部署流程等
2.脚本说明
Git钩子默认提供的脚本样本通常是shell脚本,但实际上可以写入任何可执行脚本。我们可以根据需要,使用shell、Python、Ruby、Perl等各种编程语言编写钩子脚本,只要它们能在目标系统的环境中正确执行即可。所以,即使初始模板可能是shell脚本,我们也可以自由选择我们所熟悉或项目所需的任何语言来编写Git钩子
3.分类
- 客户端钩子:客户端钩子在本地执行,在提交和合并时触发
- 服务端钩子:在远程仓库执行,在推送时触发
4.客户端钩子
介绍
客户端钩子在本地执行,在提交和合并时触发
所在位置
这些钩子可以在Git仓库的.git/hooks目录下找到,并以.sample结尾作为示例。如果要使用Git钩子,需要将示例文件重命名,以去除.sample后缀,并添加我们自己的脚本内容
默认情况
当初始化一个Git仓库后,会存在一些默认的钩子,这些钩子在某些特定的情况下触发以完成一些特定的功能
默认情况下,这些钩子并非激活状态,而是以.sample后缀名存在,如precommit.sample。要启用它们,只需移除后缀名并赋予执行权限
常见实现
基础生命周期
案例
pre-commit钩子
pre-commit钩子在提交操作执行前执行。下面以pre-commit钩子来演示一个最简单的钩子使用
- 初始化一个Git仓库,在.git/hooks目录中将pre-commit.sample的后缀.sample去掉。这样,这个钩子就生效了
- 将.git/hooks目录中的pre-commit文件的内容编辑为如下
# !/bin/sh
echo "pre-commit钩子阻止了提交!!!"
# 非0状态退出,Git将阻止任何提交操作
exit 1
然后尝试commit会发现失败
commit-msg钩子
commit-msg钩子在编辑完提交日志后执行。我们在这个钩子中可以获取提交的日志,该钩子也能阻止本次的提交操作。如果脚本以非0退出状态,那么,本次提交操作将被阻止
在.git/hooks目录中将commit-msg.sample的后缀.sample去掉,这样,这个钩子就生效了。commit-msg文件内容如下
# !/bin/sh
# 获取这一次提交日志
COMMIT_MSG=$(cat $1)
# 打印提交日志
echo "本次的提交日志为:" $COMMIT_MSG
# 如果提交是No,那么就终止提交
if ["$COMMIT_MSG" == "No"]: then
echo "提交失败,终止本次提交!"
exit 1
fi
尝试commit,如果日志内容不是No则失败
采用Java实现钩子
介绍
我们可以根据程序退出的状态来控制提交操作,可以根据实际情况来编写钩子。另外,Git的钩子不局限于shell,我们可以使用各类编程语言来编写钩子脚本以符合需要。下面将以Java代码来实现一个pre-commit钩子
案例
在.git/hooks/classHooks目录(该目录可以为任意名称)下准备一个Java程序内容如下,随后将其编译为.class文件
public class Demo01 {
public static void main (String[] args) {
// 获取执行该程序传递的参数
String pwd = args[0];
if (pwd.equals("admin")) {
System.out.println("您的密码为:"+pwd+",密码正确,可以提交!");
System.exit(0);
}else {
System.out.println("您的密码为:"+pwd+",密码错误,不可以提交!");
System.exit(1);
}
}
}
编写pre-commit钩子
# !/bin/sh
java -classpath "./.git/hooks/classHooks/" Demo01 "abc"
使用git commit命令测试
echo "admin" >>> aaa.txt
git commit -m "admin"
跳过钩子
现代前端工具集
5.服务端钩子
介绍
在远程仓库执行,在推送时触发