Git Hooks 是什么?简介 Git Hooks 是什么?为什么要使用 Git Hooks?如何实现 Hook?实例 Git 预推送 Hook?如何绕过 Hook?版本控制 - Git Hooks 总结

2025-06-10

什么是 Git Hooks?

介绍

什么是 Git Hooks?

为什么要使用 Git Hooks?

实现钩子

实际例子

Git 预推送钩子

绕过钩子

版本控制 - Git Hooks

结论

介绍

在本文中,我们将了解什么是 Git Hooks,为什么使用 Git Hooks 是有益的,以及如何使用它们进行开发的一些实际示例。

什么是 Git Hooks?

Git 钩子是 Git 仓库中每次发生特定事件时自动运行的脚本。通过这些脚本,您可以自定义 Git 的内部行为,并在开发生命周期的关键点触发可自定义的操作。

钩子有两种:

  • 客户端(本地)钩子 - 它们由本地存储库上的事件触发。例如,当开发人员提交或合并代码时。
  • 服务器端(远程)钩子 - 它们由托管代码库的服务器上的事件触发。例如,当开发人员推送代码时。

为什么要使用 Git Hooks?

作为学习过程的一部分,“为什么要使用某种技术?”这个问题对于理解其存在的真正意图或目的至关重要。

在我看来,采用明确定义的流程和使用自动化极大地提高了团队以可预测的方式交付软件的生产力。

开发人员的典型一天是编写代码并提交到项目代码库。高级开发人员通常会在代码提交时撰写有意义的提交信息。然而,对于刚加入项目的初级开发人员来说,情况并非如此。

作为检查点,项目负责人可以建立一个标准的提交消息格式,并确保其他团队成员也必须遵守。一个很好的例子是确保每条提交消息都以 JIRA 任务 ID 开头。这成为了 Git 钩子的绝佳用例。您只需自定义“预提交”Git 钩子,它可以拦截开发人员的任何提交,并验证是否存在 JIRA 任务 ID。

上面提到的只是一个简单的例子。实际上,我们可以用钩子做更多的事情,比如检查代码风格(运行 lint 或类似工具),运行静态代码分析工具(例如 Sonarqube 或类似工具),检查 API 方法的文档(如果是新引入的)等等。可能性无穷无尽。

实现钩子

Git Hooks 是每个 Git 仓库都自带的内置功能。初始化新项目时,Git 会自动将模板文件添加到 Hooks 文件夹中。

让我们采取一步一步的方法:

步骤 1 - 创建新项目文件夹并初始化 Git

  1. 转到任意文件夹并创建一个新文件夹“myproject”。
  2. 进入您的项目并初始化 git 存储库。
  3. 您将看到如下所示的消息并创建一个“.git”文件夹。
$ mkdir myproject
$ cd myproject
$ git init

//Ouput -> Initialized empty Git repository in <<folder>>/myproject/.git/
Enter fullscreen mode Exit fullscreen mode

第 2 步 - 找到 Hooks 文件夹并查看文件

  1. 进入你的“.git”文件夹,你应该会看到以下文件夹列表。

替代文本

  1. 进入“hooks”文件夹,您应该看到以下文件列表:

替代文本

  1. 所有带有“.sample”扩展名的文件都表示它们作为样本存在,默认情况下不会执行。

  2. 在 git 生命周期中,每个文件都会被触发一个特定的事件。代码“1”表示出现错误,进程会立即退出;代码“0”表示进程正常完成。

步骤 3 - 安装/启用要执行的 Git 钩子

要启用这个钩子,只需从文件名中删除“.sample”扩展名即可。一旦我们这样做,Git 就会立即识别出它应该执行该文件。在上面的例子中,文件“pre-commit.sample”被重命名为“pre-commit”。

  • 通过删除“.sample”扩展名来重命名文件。
$ mv pre-commit.sample pre-commit
Enter fullscreen mode Exit fullscreen mode
  • 更改权限使其可执行
$ chmod +x pre-commit
Enter fullscreen mode Exit fullscreen mode

步骤 4 - 选择语言

默认文件以 Shell 脚本编写。您可以使用任何脚本语言,只要它可以作为可执行文件运行即可。支持的语言包括 Bash、Python、Ruby、Perl、Rust、Swift 和 Go。

要选择您想要的语言,请在代码编辑器中打开文件并使用 shebang(#!)符号指示语言,这样 Git 就知道如何解释后续脚本。

例如:

选择“shell”

#!/bin/sh
Enter fullscreen mode Exit fullscreen mode

选择“bash”

#!/bin/bash
Enter fullscreen mode Exit fullscreen mode

实际例子

提交代码前检查电子邮件是否有效

开发人员拥有多个 Github 帐户是很常见的,一个帐户可以链接到个人电子邮件帐户,另一个帐户可以链接到工作电子邮件帐户。

让我们看一下创建一个“预提交” Git Hook,以确保我所做的任何提交都来自电子邮件 ID“ skay@gmail.com ”。 (假设这是工作电子邮件地址)

预提交 Git Hook

预提交 Git 钩子用于检查提交文件的用户是否将用户电子邮件地址设置为“ skay@gmail.com ”。

#!/bin/sh

# Make sure the email is set properly before committing the file
useremail=$(git config user.email)

# Check if the git config useremail DOES NOT MATCH skay@gmail.com
if [ "$useremail" != "skay@gmail.com" ]
then
        cat <<\EOF

# OUTPUT THE ERROR ON THE TERMINAL
Error: user.email not set to "skay@gmail.com"
EOF

# EXIT WITH 1 INDICATES ERROR
        exit 1
fi
Enter fullscreen mode Exit fullscreen mode

注意事项:

当用户尝试提交文件时,脚本将运行。

文件中发生的步骤如下:

  • 第一行‘#!’表示该脚本是一个 shell 脚本。
  • 从 git config user.email 中获取“usermail”。
  • 检查“useremail”是否与“ skay@gmail.com ”不匹配,然后在终端上抛出错误。

运行提交来验证 Git 钩子是否被调用

步骤 1

转到“myproject”文件夹

$ cd myproject
Enter fullscreen mode Exit fullscreen mode

第 2 步

创建新文件

$ nano demo.txt
Enter fullscreen mode Exit fullscreen mode

步骤3

输入一些文本并保存文件!

替代文本

步骤4

检查 git-config 中设置的当前用户电子邮件

替代文本

步骤5

Git 添加并提交文件到本地存储库。

$ git add demo.txt

$ git commit -m "Testing Pre-Commit Git Hook"
Enter fullscreen mode Exit fullscreen mode

步骤6

如果 Git 的“pre-commit”Hook 正确触发,那么您应该在终端上看到以下错误,因为 git config 用户电子邮件(skaytech30@gmail.com )与“ skay@gmail.com ”不匹配

替代文本

恭喜!您刚刚创建了第一个 Git Hook 并成功运行。

Git 预推送钩子

我的朋友西蒙在下面的推文中出色地解释了预推钩的另一个很好的例子。

绕过钩子

Git Hook 很容易被“--no-verify”标志绕过或覆盖。在上面的例子中,如果您想免除运行“pre-commit”钩子,则必须添加 no-verify 标志,如下所示。

$ git commit -m "Testing Pre-Commit Git Hook" --no-verify
Enter fullscreen mode Exit fullscreen mode

版本控制 - Git Hooks

正如你所观察到的,Git 钩子对于任何仓库来说都是本地的。一个简单的解决方法是在项目仓库中创建一个“scripts”文件夹,以启用 git 钩子文件的版本控制,这样就可以扩展它们以供整个团队使用。

结论

添加 Git 前/后钩子 (Hooks) 是确保软件开发生命周期中存在检查点的简单方法。此外,钩子可以以任何方式扩展,以辅助在特定文件提交时触发的重复测试。

虽然一开始可能需要一些时间来设置,但您会获得很多好处,特别是随着团队的发展。

如果您想进一步阅读,这里有一篇由Atlassian 撰写的关于 Git hooks 的非常好的文章。

希望你喜欢这篇文章。请告诉我你对本文的反馈和评论。

如果您喜欢这篇文章,您可能还会喜欢:

鏂囩珷鏉ユ簮锛�https://dev.to/skaytech/what-are-git-hooks-99m
PREV
JavaScript 中的 this 是什么?简介 JavaScript 中为什么存在 this?隐式绑定 显式绑定 new 绑定 词法绑定 窗口绑定 结论
NEXT
作为初级开发人员如何提供估算?