关于 hook
所谓的 hook 就是存在于.git/hooks/
目录下的一些脚本文件(shell、Python、Ruby、Perl 皆可),这些脚本文件可以在某些 git 操作执行之前或者之后触发,可以让开发者来自定义属于自己的工作流。比如我们可以在自己本地添加一个 hook 在我们每次提交 commit 信息以后执行,检查我们的 commit 信息是否符合规范,如果不规范就退出当前这次提交。git 为我们预留了 14 个 hook 分别适用于本地 commit 、邮件通知、衍合、合并、开新分支以及服务器接收提交。在使用的时候只要把我们写好的脚本按照 git 要求的文件名放到 git 仓库中的 .git/hooks/
目录中就好。
如何在 Stash 中添加 hook
如果想添加服务器 hook,就需要在服务器端的 .git/hooks/
目录下添加脚本文件,这就需要拥有 Stash 服务器的文件系统的权限,如果是在公司的环境下还要去向管理员申请权限,是比较麻烦的,还好目前 Stash 上有一些插件可以比较方便的实现我们一般在服务器添加 hook 要实现的需求,这里挑两个简单介绍下。
Yet Another Commit Checker
这个插件主要用于检查 commit message ,其是一个 pre-receive hook ,就是说如果 commit message 如果不合法,这些 commit 就会无法 push 上去。该插件的主要功能有:
检查 commit 的邮箱、姓名;
利用正则表达式检查 commit message;
通过 JIRA 检查 commit message 中的 task ID 是否合法,同时会忽略一些类似 task ID 的字段(比如『UTF-8』这种的);
通过 JQL规定查找到的 task 的状态,比如可以规定 task ID 对应的 task 必须状态是 Open 的;
通过正则检查分支名;
自定义错误提示消息;(默认的错误消息里头有一只萌萌的小熊)
忽略 merge 的 commit 不进行检查,也可以通过正则忽略一些 commit 不进行检查, 也可以忽略从其他 service 来的 commit (如 CI 系统的生成的 commit)。
使用配置
在 Stash 中安装插件后,点击插件后就可以打开插件的配置项。配置项分为很多部分,以下一一陈述。
首先是配置 commit message 的检查选项,前两项开启后会检查 push 的 commit message 中是否使用的是 Stash 上的用户名和邮箱。第三项则是自定义的用于检查 commit message 的正则表达式,这里要求整个 commit message 都要符合这个正则表达式。这里写的是([A-Z]+-\d+)-(.|\n)*
,最后的(.|\n)*
是为了识别多行的 commit message。
然后是配置是否检查 task ID 合法。前面的正则表达式仅仅能够检查格式上是否符合一个 task ID 的格式,但是会把『IPH-456-test』这样的内容认为是合法的,要想做进一步的检查,就需要向 JIRA 查询这个 task ID 是否是合法的。
开启了第一个选项以后,如果之前的正则表达式的部分没有分组,那么就会用所有的 commit message 作为 task ID 去进行合法性校验(首先 commit message 要符合正则)。如果正则表达式有分组,就会用符合正则表达式的部分中对应分组的部分作为 task ID 去进行合法性校验。可以用第二种方式来主动定位 task ID。(如果有多个分组呢?测试后发现有多个分组时会把第一个分组作为 task ID)。
第二个选项则是会忽略一些形似 task ID 的、符合正则的 commit message 部分,比如『UTF-8』这样的部分。开启了第二个选项可以防止因为这样的字符存在而导致的检查失败。
第三个选项是使用 JQL 来设置查找到的 task 的状态,比如可以通过 status="open"
来指定对应的 task 必须是处于 open 状态的。更多的一些用法可以参照 JQL 的语法。
然后还可以利用正则表达式检查分支名。
自定义错误信息,这样 push 失败以后就会这样显示(小熊是默认的 header):
最后就是设置例外 commit 了,第一个选项开启后可以提交 merge commit ,第二个就是用正则来进行例外设置,第三个开启后则是会例外一些来自服务的 commit。