第 14 章 钩子 钩子
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
Git 钩子允许你调整标准的 Git 操作。 每当仓库中发生提交或补丁等特定事件时,你可以使用 Git 钩子运行一个或多个任意脚本。通常情况下,一个事件会被分解成几个规定的步骤,你可以为每个步骤绑定一个自定义脚本。当 Git 事件发生时,在每一步开始时都会调用相应的脚本。
钩子属于并影响特定的版本库 ,在克隆操作过程中不会被复制。换句话说,您在私有版本库中设置的钩子不会传播到新克隆,也不会改变新克隆的行为。如果出于某种原因,您的开发流程要求在每个开发人员的个人开发仓库中设置钩子,请安排通过其他(非克隆)方式复制.git/hooks目录。
请勿将此与初始化新仓库混淆。当指定git init 命令时,Git 会将可用的钩子复制到新仓库中;这些钩子可以包括 Git 提供的默认示例钩子,也可以包括你在通过模板目录机制定义的可配置路径中指定的一些自定义钩子。
在本章中,我们将首先讨论可用的 Git 挂钩类型以及如何安装它们,然后指导你创建一个简单的 Git 挂钩。我们还会解释如何以及何时使用 Git 挂钩来改变标准的 Git 操作。
挂钩类型
钩子既可以在当前本地版本库的上下文中运行,也可以在远程版本库的上下文中运行。 例如,从远程版本库向版本库获取数据并进行本地提交会导致本地钩子运行;向远程版本库推送更改可能会导致远程版本库中的钩子运行。这类钩子也被称为客户端钩子和服务器端钩子(客户端指本地版本库,服务器指远程版本库)。通常,服务器端或远程钩子指的是在集中或上游版本库副本中启用的钩子。
大多数 Git 钩子分为两类:
-
预 "钩子在操作完成前运行,可用于在应用更改前批准、拒绝或调整更改。
-
后 "钩子在操作完成后运行,可用于触发通知(如电子邮件)或启动其他处理,如运行构建或关闭错误。
一般来说,如果行动前 钩子以非零状态(表示失败的惯例)退出,Git 行动就会中止。相反,行动后钩子的退出状态通常会被忽略,因为该钩子不再影响行动的结果或完成。
关于使用钩子的说明
一般来说,Git 开发人员主张谨慎使用 钩子。他们认为,钩子应该是最后的手段,只有在无法用其他方法达到同样效果时才使用。例如,如果你想在每次提交、签出文件或创建分支时都指定一个特定选项,那么就没有必要使用钩子。你可以用 Git 别名(参见"配置文件")或 shell 脚本来完成这些任务,它们分别是git commit 、git checkout 和git branch 。1
乍一看,挂钩似乎是一个吸引人且简单明了的解决方案。然而,它的使用会产生一些影响:
-
钩子会改变 Git 的行为。如果钩子执行了不寻常的操作,其他熟悉 Git 的开发者在使用你的版本库时可能会遇到意外。
-
钩子会拖慢原本快速的操作。例如,开发人员经常会被诱使挂钩 Git,在提交前运行单元测试,但这样会使提交速度变慢。在 Git 中,提交本应是快速的操作,因此鼓励频繁提交以防止数据丢失。让提交运行缓慢会让 Git 变得不那么有趣。
-
有漏洞的钩子脚本会影响你的工作和效率。绕过钩子的唯一办法就是禁用它。相比之下,如果你使用别名或 shell 脚本来代替钩子,那么无论在哪里,你都可以随时使用正常的 Git 命令。
-
版本库的钩子集合不会自动复制。因此,如果你在自己的版本库中安装了提交钩子,它不会可靠地影响其他开发者的提交。这一方面是出于安全考虑--恶意脚本很容易就会被偷渡到一个看起来无害的版本库中;另一方面也是因为 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access