钩子

231 阅读3分钟

钩子的意义和作用就不多冗述。 钩子的本质首先就是脚本,我们常见的钩子有挺多的,precommit等。 钩子有很多种,根本触发位置主要分为两类,本地钩子和服务端钩子。这里就主讨论这两个方向。

钩子的位置

钩子的位置大多数放在. git/hooks文件夹下,git在初始化的时候也已经构建了很多sample,都是可用的,但是后缀名阻止了使用。 image.png

我们可以看到,钩子非常的多,但是我们实际上用到的可能就两三个。 钩子的脚本语言基本都是使用shell或者perl,操作系统的底层语言,这个可以简单学习下,知道怎么应用就行了,需要用到什么功能就搜什么就完事了。但是实际上,可以使用任何语言作为脚本,如python等,只需在第一行注释声明使用的环境和解释器,前端甚至可以使用node。

钩子范围

在指定的仓库中,大多数的钩子都是在本地的,不会随git clone就到其他仓库(也就是, .git/hooks文件不会被clone下去),所以钩子很大程度是只能表达一种希望,希望团队的成员或者使用者能按照规范提交和开发,但不能绝对控制,毕竟,本地钩子一删,还是想怎么提交都行的。基于此,最好是把Git钩子当做方便开发者自己的工作,而不是严格的开发规范来使用。(在bug处理方面的预防还是很有必要的。) 所以要传承这个团队的风格,这些校验和规范部分就不会放在hook/文件夹下,而是放在其他目录,然后通过安装的方式投射钩子,简单的做法就是复制粘贴。 此外,Git也提供了一种称为模板目录Template Directory的机制可以自动安装钩子。在模板目录下的所有除了以.开头的文件,在使用git init或者git clone命令时都会被自动复制到.git目录下。?这是个什么操作 前面的这些都是相对于本地钩子来说的,服务端钩子另算,先看本地钩子吧。

本地钩子

常用六钩:

  1. pre-commit
  2. pre-commit-msg
  3. commit-msg
  4. post-commit
  5. post-checkout
  6. pre-rebase带pre-的都是实际操作前触发的。
pre-commit

每一次执行git commit命令时,在要求填入提交信息或者生成提交对象之前(提交对象,也就是一次hash吧),会触发。利用这个钩子检查提交体和仓库。 不需要传入额外参数,脚本执行中,退出信号不为0的时候,会终止提交,下面可以看下。(注:这里的脚本都是py,习惯,但是需要注意的是,如果这些地方使用python,mac下会使用global中的python,而这部分的python大部分都是2.x版本,而你在使用和安装第三方依赖的时候,基本已经在使用py3了,如果在脚本中需要用到依赖,则需要给py2另外装,建议不要直接替换内置的python版本,可能其他的内置应用用到了)。 pre-commit

#!/usr/bin/env python

exit(1) 

exit 0之外的任何输出都会导致提交失败终止,并提示你上一个print的对象(如没有,则会根据语言环境提示错误或者error),如下图,这里我用的是vscode,所以有这个交互。 image.png

Prepare Commit Message

上一个钩子之后执行的钩子,校验的内容顾名思义,commit的msg。目前市面上有很多现成的提交msg规范,如果基建团队不愿意多费心思和定制的话,可以直接搬用,大差不差。 它会弹出含有提交信息的文本编辑器,如下,这个vscode转换过后的。 image.png

脚本接收三个参数 ​ ​ ​ ​ ​ ​ 参考: Git高级操作: Git钩子 ​ ​