自定义 Git - Git 钩子



Git 钩子

Git 钩子是在执行特定 Git 操作时自动运行的脚本。它允许您自动化任务并执行策略,从而增强工作流程。

Git 钩子有两种类型:**客户端**和**服务器端**。

  • 客户端钩子在提交或合并事务时激活。

  • 网络活动(例如接收推送的提交)会导致服务器端钩子激活。

  • 我们可以使用这些高度自定义的钩子来自动执行代码 lint 和测试运行等流程。

  • 这些钩子使我们能够在整个开发过程中保持统一的实践并优化工作流程。

  • 服务器端钩子在克隆存储库或创建新分支时激活。

安装钩子

要安装**Git 钩子**,请将脚本移动到 Git 存储库的**.git/hooks**文件夹中。

当我们使用**git init**初始化存储库时,Git 会在此目录中生成示例钩子脚本。

  • 虽然示例脚本通常是用 Perl 或 shell 脚本编写的,但它们也可以用其他语言编写,例如 Python 或 Ruby。

  • 重命名脚本(删除**.sample**扩展名)以将其用作示例。

  • 要启用钩子,请在**.git/hooks**目录中放置一个具有正确名称且没有文件扩展名的可执行脚本。

  • 配置脚本后,它将在相关 Git 操作期间自动运行。

客户端钩子

客户端钩子分为三种类型:**提交工作流钩子**、**电子邮件工作流脚本**和其他**杂项脚本**。

提交工作流钩子

我们可以使用这些钩子来自动执行检查并更改提交行为,这些钩子是在**git commit**过程中执行的脚本。

pre-commit 钩子

  • 它在键入提交消息之前运行。

  • 用于执行测试、审查代码风格并确保即将提交的更改的文档是最新的。

  • 如果它以非零状态退出,则提交将终止。可以使用 git commit **--no-verify**绕过它。

prepare-commit-msg 钩子

  • 在生成默认提交消息后但在提交消息编辑器打开之前运行。

  • 允许更改默认提交消息。

  • 它有助于自动生成的邮件,例如与压缩或合并更改相关的邮件。

  • 接收选项,例如提交类型、提交**SHA-1**(如果是已修改的提交)以及提交消息文件的路径。

commit-msg 钩子

  • 在编写提交消息后但在完成提交之前执行。

  • 用于确认项目状态或提交消息是否满足指定的要求。

  • 如果它以非零状态退出,Git 将中止提交。接收提交消息文件的路径。

post-commit 钩子

  • 在提交过程完成后运行。

  • 通常用于额外的任务或通知。

  • 使用**git log -1 HEAD**查看最近提交的信息。

  • 不需要任何参数。

电子邮件工作流钩子

我们可以为使用基于电子邮件的补丁的工作流配置三个客户端钩子。

**git am**命令(用于应用通过电子邮件接收的修复程序)会启动这些钩子。

  • 如果我们不使用**git am**,我们可以忽略这些钩子。

  • 但是,如果我们使用**git format-patch**进行更改,这些钩子可能会有所帮助。

applypatch-msg 钩子

  • 首先运行并接受一个参数,该参数是包含建议提交消息的临时文件的路径。

  • 在完成补丁应用之前,它用于验证或编辑提交消息。

  • 如果脚本以非零状态退出,则补丁应用将停止。

pre-applypatch 钩子

  • 在创建提交之前但在应用补丁之后运行。

  • 在提交更改之前,我们可以检查工作树或对修改进行测试。

  • 如果遇到任何问题并且脚本以非零状态退出,则 git am 进程将终止而不会提交。

post-applypatch 钩子

  • 在提交后运行。它有助于与已应用的补丁相关的通知或其他任务。

  • 虽然此脚本无法阻止补丁提交,但它可以用来执行诸如通知人们已应用补丁之类的事情。

其他客户端钩子

Git 客户端中提供了以下钩子。

pre-rebase 钩子

  • 在启动变基过程之前执行。

  • 如果它以非零状态退出,则可以阻止变基发生。

  • 为了保留共享历史记录,此钩子可用于限制对先前已推送的提交的变基。

  • 此钩子的逻辑包含在 Git 的默认示例中,但可能需要修改以满足我们的特定流程。

post-rewrite 钩子

  • 由更改提交的命令(而非**git filter-branch**)启动,例如**git commit --amend**或**git rebase**。

  • 它会收到受影响提交的列表以及启动重写的命令。

  • 此钩子用于更新相关系统或发送通知,以及 post-checkout 和 post-merge 钩子处理的其他事项。

post-checkout 钩子

  • 在成功执行**git checkout**后执行。

  • 我们可以使用此钩子来设置工作目录并执行特定于环境的操作,例如传输 Git 不跟踪的二进制文件或自动创建文档。

post-merge 钩子

  • 在成功合并后执行。

  • 它可以用来恢复 Git 未管理的数据,例如外部文件或文件权限,确保在合并后我们的工作目录设置正确。

pre-push 钩子

  • 在**git push**期间运行,在更新远程引用后但在传输对象之前运行。

  • 除了需要通过**stdin**更改的引用列表外,它还接收远程名称和位置作为参数。

  • 在将更改推送到远程存储库之前,可以使用此钩子对其进行验证。

  • 如果钩子以非零条件退出,则推送将终止。

pre-auto-gc 钩子

  • 在 Git 使用**git gc --auto**执行自动垃圾回收之前调用。

  • 它可以用来通知我们何时计划进行垃圾回收,或者如果这不是合适的时间,则完全停止操作。

服务器端钩子

称为**服务器端钩子**的脚本在 Git 服务器上执行,以管理与推送操作相关的不同任务并执行策略。

这些钩子能够在推送完成后执行操作或拒绝推送。

pre-receive 钩子

  • 当客户端将修改推送到服务器时,此脚本将首先执行。

  • 通过 stdin,它接收引用(分支或标签)列表。

  • 此钩子的非零退出状态表示不接受任何引用。

  • 使用它来实施规则,例如限制对引用的访问或禁止非快进修改。

update 钩子

  • 此钩子与 pre-receive 钩子类似,但会针对每个推送的分支独立运行。

  • 所需的参数:引用的名称、引用的前一个 SHA-1 以及客户端正在推送的新 SHA-1。

  • 如果此钩子以非零状态退出,则仅拒绝该分支更新;其他分支更新可能仍会被接受。

post-receive 钩子

  • 在推送过程结束后执行。

  • 通过 stdin,它获取与**pre-receive 钩子**相同的引用列表。

  • 此钩子用于发送电子邮件、更新问题跟踪系统和通知其他服务(如持续集成服务器)等。

  • 客户端在断开连接之前会等待此钩子完成,因此如果它需要长时间的活动,即使它不能中断推送过程,也应谨慎使用。

使用 Git 钩子的好处

以下是使用 Git 钩子的一些好处

  • **任务自动化** - 测试、格式化或部署等任务本质上是重复性的,可以使用钩子来自动化。

  • **标准执行** - 即使在代码提交或推送之前,也要确保执行代码标准和最佳实践。

  • **与其他工具集成** - 允许您与其他工具集成,例如 CI/CD 管道或通知服务。

Git 钩子是自定义工作流程和确保项目中代码质量的强大方法。

广告