更规范的 commit 吧!

189 阅读4分钟
    /**
        @date 2022-06-25
        @description 如何规范的 commit
    */

壹(序)

日常开发中我们基本是使用 git 进行项目管理,使用 git 主要分为两种方式,一种是通过 GUI,一种是使用 Terminal。

而 git 的原生环境是 Terminal,只有使用 Terminal 才能发挥出 git 最大的能力,所以我对于 git 的使用都是通过 Terminal。

但是无论是使用 GUI,还是使用 Terminal,我们都需要 commit,个人觉得 git 的 commit 信息是十分重要的,不管是个人项目还是多人合作项目,我们都应该写好每一次 commit message,这样在追溯某些东西时,从 commit message 中就能获取一些关键信息。

相对于代码规范,我们也会有 commit 规范,但是很无奈的是并不是每名开发者都能严格遵守规范,或者说每名开发者对于规范的要求不一样,所以我们在项目中加入 lint 检查,一般我们项目中的 lint 是用来针对代码的,那么我们也可以使用一些 lint 来针对 commit message。

对于 commit message 的 lint,个人认为做好两点即可:

一是制定相应的 commit 规范,并提供模板让开发者在填写 commit message 时能看到,从而提醒开发者应该怎么去书写 message;

二是通过 git hooks 禁止不符合规范的 commit 提交;

贰(message template)

每次 commit 时,都需要输入 message,在不使用 git commit -m 的情况下,直接 git commit,会有默认的提示,然后在其中输入 message

defaultTemplate.jpg

为了使用自制的 commit 规范提示,我们可以使用 git config commit.template ./xxx.txt 进行模板设置,之后我们每次 commit 时,就会看到自己的模板提示

template.jpg

这样每次写 commit message 时,都能有一个提示,让提交者能够有意识的去写规范的 message

可以看下两次提交的对比,明显的,第二次使用了模板后,message 会清晰很多

contrast.jpg

message template 是一个 TXT 文件即可,需要注意行首需要增加 #,因为 commit message 会忽略 '#' 的行。

叁(git hooks)

只指定 commit template 是不够的,毕竟这只是一个提示信息,提交者还是想怎么写就怎么写,所以我们还需要一种 commit lint 去强制性的约束提交者。

因为是有关于 git commit message 的 lint,所以这里介绍一种方式是通过 git hooks,git hooks 支持 server-side 以及 client-side,不过如果将 hooks 布置在服务端,在 push 时才告诉提交者无法提交,就得重新修改文件,重新提交,还无法保证这次修改就是符合要求的,所以对于 commit message lint,client-side 是更好的选择。

肆(commit-msg)

这里可以使用 commit-msg hook,在每次本地 commit 时就检查这次的 commit message 是否符合规范,不符合直接退出提交。

但是在本地写 git hooks 会有一个问题,git hooks 都是放置在 .git/hooks 中,但是 .git 是不会跟随项目提交到远程的,所以需要想办法将自定义的 hooks 分发到项目的 .git/hooks 中。

这里我们最好是使用已经被社区认可的开源项目,如: husky

不过这里也可以尝试一下自己解决,可以在 package.json 中添加一个 postinstall 钩子,然后在项目 npm install 后自动运行这个钩子,这个钩子需要做的事情就是:将自定义的 hooks 分发到项目的 .git/hooks 中。

如何做到让 git 使用我们自定义的 hooks 呢,答案是使用 git config,git config core.hooksPath 可以指定 hooks 的 path,这样就能满足我们的要求了。

所以先创建自定义的 hooks,然后写一个 commit-msg hook:

注意:这里虽然是用的 node,但是不能加后缀

#!/usr/bin/env node
const fs = require('fs');

// 获取 commit message
const commitMsg = fs.readFileSync(process.argv[2], 'utf-8').trim(); 
const commitReg = /^(feat|fix|doc|style)(\(.+\))?: .{1,100}/;

if (!commitReg.test(commitMsg)) {
  console.log();
  console.log('不合法的 commit 消息格式,请使用正确的提交格式:');
  console.log();
  process.exit(1);
}

然后在 package.json 中增加一条:

"scripts": {
    "postinstall": "git config core.hooksPath githooks"
},

最后重新 npm install,我们就完成了 commit-msg 的布置,如果提交不符合规范,会直接退出并提示:

errorCommit.jpg

successCommit.jpg

最后想说一点,我觉得规范只是约束,最重要的是意识。

一名合格的开发人员,并不需要条条框框,有意识的去做这些符合规范的、让协同开发更舒服,更健康的事情,是他应该具备的素质。