12.钩子

18 阅读3分钟

钩子

1.介绍

Git钩子是嵌入在Git中的一系列可执行脚本,在特定Git操作执行前后触发,类似于触发器的角色。它用于实现自动化任务、执行自定义验证及工作流扩展,例如在提交前运行代码质量检查、推送后自动部署。常见场景涵盖代码校验、测试、邮件通知、部署流程等

1769937311707.png

2.脚本说明

Git钩子默认提供的脚本样本通常是shell脚本,但实际上可以写入任何可执行脚本。我们可以根据需要,使用shell、Python、Ruby、Perl等各种编程语言编写钩子脚本,只要它们能在目标系统的环境中正确执行即可。所以,即使初始模板可能是shell脚本,我们也可以自由选择我们所熟悉或项目所需的任何语言来编写Git钩子

3.分类

  • 客户端钩子:客户端钩子在本地执行,在提交和合并时触发
  • 服务端钩子:在远程仓库执行,在推送时触发

4.客户端钩子

介绍

客户端钩子在本地执行,在提交和合并时触发

所在位置

这些钩子可以在Git仓库的.git/hooks目录下找到,并以.sample结尾作为示例。如果要使用Git钩子,需要将示例文件重命名,以去除.sample后缀,并添加我们自己的脚本内容

默认情况

当初始化一个Git仓库后,会存在一些默认的钩子,这些钩子在某些特定的情况下触发以完成一些特定的功能

默认情况下,这些钩子并非激活状态,而是以.sample后缀名存在,如precommit.sample。要启用它们,只需移除后缀名并赋予执行权限

常见实现

FigureT40585299.jpg

基础生命周期

1769938093975.png

案例

pre-commit钩子

pre-commit钩子在提交操作执行前执行。下面以pre-commit钩子来演示一个最简单的钩子使用

  1. 初始化一个Git仓库,在.git/hooks目录中将pre-commit.sample的后缀.sample去掉。这样,这个钩子就生效了
  2. 将.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"

跳过钩子

1769938668353.png

现代前端工具集

1769938458755.png

5.服务端钩子

介绍

在远程仓库执行,在推送时触发

常见实现

FigureT40585301.jpg