Git 进阶之 Hooks 妙用

701 阅读3分钟

Git 进阶之 Hooks 妙用

开篇先想象以下几个场景

  • 看着同事提交信息,怎么判断那个提交在做什么?
  • 拉取同事最新的代码,发现编译失败,耽误自己开发怎么办?
  • 提交代码后忘记触发 CI(Continuous Integration)怎么办?

这些问题答案也很简答:问同事,自己写一个检查清单来保证自己提交步骤。

低频操作下这个方案也许确实可行,高频操作的时候这不免有些繁琐。因为忘记部署,测试人员提的 bug,你在本地死活无法复现,心情是不是很崩溃?那么上述问题有没有自动化的解决方案呢?编译失败就不让提交,提交了就自动跑 CI 部署。

以上问题的答案就是:Git-Hooks。

什么是 Git-Hooks

Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits. You can use these hooks for all sorts of reasons.

这是 Git 官网对 git-hooks 的描述。简单的说就是,Git 能在特定的重要动作发生时触发自定义脚本,而这些脚本的执行触发就是靠 Git-Hooks。

Hooks 通常放在 .git/hooks 目录下面,并且还有相应的示例,这些示例以 .sample 结尾。

Hooks 用法之 commit-msg

看这个名字应该就知道这个 hooks 的作用了。在 commit-msg 里面,我们可以自定义一个脚本来检查提交信息,把不符合团队规范的提交直接拒绝掉。这样任何同事看到提交信息就可以明确本次提交的内容范围。

Hooks 用法之 pre-push

pre-pushgit push 运行期间触发,在这个脚本里面可以执行以下项目编译、跑跑单元测试之类的,确保自己 push 的代码不会影响其余同事的开发。

Hooks 用法之 post-receive

上面两个讲的是客户端钩子,post-receive 是一个服务器端的 Hooks,当服务器端接受一些客户端的推送后,这个 Hooks 就会被触发。在 post-receive 里面我们可以通知服务器进行新代码的部署操作,也可以发送邮件给指定的人员。

总结

或者你觉得这节内容对开发人员其实是增加额外的工作量,甚至有些时候你觉得这些都是一些无关紧要的小事。提交信息看不懂就算了,直接看代码更直接;编译失败了自己快速修复一下;CI 忘记部署了,自己马上去部署一下;好像都是一些小事,不值一提。但软件开发是团队合作模式,也许一次编译失败就会导致其余所有人员浪费时间去修复这个问题。如果遇见严重问题了,直接就会阻塞整个团队的开发进度。

最后,作为一个合格的开发人员,要对自己的代码负责。但人总有想要偷懒的时候,这个时候就只能靠这个脚本约束了。脚本会一丝不苟的执行预先设置好的命令。