git commit规范及自动检查工具安装小记

5,786 阅读5分钟

git提交代码前都需要使用git commit命令对本次提交进行说明,但是很多人平时可能并不重视这个环节,导致commit记录写的很随意,没有发挥其意义与价值。

在网络上浏览一圈后发现有一种Anjular团队规范比较受大家欢迎(效果见下图),并且有一套完善的工具链Commitizen + cz-conventional-changelog/cz-customizable + Commitlint + Husky帮大家进行commit的格式控制和git提交前门禁检查。

anjular团队的提交记录

这里将我安装这套工具的过程记录下,便于以后查找。

Commitizen

commitizen是一个帮助规范commit message的工具,它可以帮我们控制 commit 的格式,并让提交复杂格式时比git commit -m更加容易,使用它提交git commit的样子如下图:

基本使用:

安装 commitizen :

npm install -g commitizen

安装好后,需要安装一个adapter来定义希望使用的 commit message 格式。如果使用上面的 anjular 的规范,可以使用cz-conventional-changelog这个 adapter 。通过 commitizen 提供的命令行工具去初始化项目中希望使用的 adapter 。在项目目录下执行:

commitizen init cz-conventional-changelog --save-dev --save-exact

这个命令会帮我们在项目中安装 cz-conventional-changelog 并在 package.json 中添加如下内容:

"config": {
  "commitizen": {
    "path": "./node_modules/cz-conventional-changelog"
  }
}

之后,全局安装了 commitizen 的朋友就可以通过git cz命令代替git commit命令,从而调出如下图的界面,根据界面提示输入 commit 信息并提交。

当然,如果不想使用全局安装,例如希望项目中其他成员不用本地安装 commitzen 就能直接使用同一套工具和配置,可以将 commitizen 和它的 adapter(如:cz-conventional-changelog) 安装到项目本地,使用npx git-cz或者配置 package.json 中 scripts 。这在 github主页上也有详细方法说明

定制和拓展:

上面的配置可以让我们简单方便的使用 commitzen 工具规范 commit 信息,但实际中很多项目会有不同的规范,对此 commitizen 有各种 adapter 来提供一些可定制的格式。例如下面介绍的cz-customizable,这也是 commitizen 的一个 adapter ,格式类似上面的 cz-conventional-changelog ,但提供一定程度的自定义。

anjular规范的格式如下:

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
……

cz-customizable 自定义配置可以对上面的 type、scope、subject、body等进行设置与限定,例如设置type的种类、subject的字数、body的换行符等。方法是在项目根目录下新建 .cz-config.js 配置文件,在该文件中对上述字段设置规则。官方github上有给出该文件写法的一个示例。还有我自己参照网上示范写的一个配置例子如下:

'use strict';

module.exports = {

  types: [
    { value: 'WIP',         name : '🚧  WIP:            开发中' },
    { value: 'feat',        name : '✨  feat:           一个新特性' },
    { value: 'improvement', name : '➕  improvement:    对现有特性的提升' },
    { value: 'fix',         name : '🐛  fix:            修复Bug' },
    { value: 'refactor',    name : '🛠  refactor:       代码重构,注意和特性、重构区分开' },
    { value: 'docs',        name : '📚  docs:           变更文档' },
    { value: 'test',        name : '🏁  test:           修改或添加测试文件' },
    { value: 'config',      name : '📝  config:         修改或添加配置文件' },
    { value: 'style',       name : '💅  style:          修改格式,不影响功能,例如空格、代码格式等' },
    { value: 'perf',        name : '📈  perf:           性能提升' },
    { value: 'ci',          name : '🔧  ci:             修改ci相关配置、脚本等' },
    { value: 'revert',      name : '⏪  revert:         回退版本' },
    { value: 'chore',       name : '🗯  chore:          杂务,不属于以上类型,例如run build、引入或更新软件包等' },
  ],

  // scopes: [{ name: 'accounts' }, { name: 'admin' }, { name: 'exampleScope' }, { name: 'changeMe' }],

  // allowTicketNumber: false,
  // isTicketNumberRequired: false,
  // ticketNumberPrefix: 'TICKET-',
  // ticketNumberRegExp: '\\d{1,5}',

  messages: {
    type: '选择一种你的提交类型:',
    scope: '选择修改涉及范围 (可选):',
    // used if allowCustomScopes is true
    customScope: '请输入本次改动的范围(如:功能、模块等):',
    subject: '简短说明:\n',
    body: '详细说明,使用"|"分隔开可以换行(可选):\n',
    breaking: '非兼容性,破坏性变化说明 (可选):\n',
    footer: '关联关闭的issue,例如:#31, #34(可选):\n',
    confirmCommit: '确定提交说明?'
  },

  allowCustomScopes: true,
  allowBreakingChanges: ["feat", "fix"],  // 仅在feat、fix时填写破坏性更改
  subjectLimit: 100, // limit subject length
  breaklineChar: '|',  // 设置body和footer中的换行符
};

这里我拓展了几个type类型,并对提示语进行了汉化。最后执行 git cz 的效果如下(这些emoji图标是从这个网站复制来的):

使用commitizen 工具提交 commit ,规范自己的 git commit message ,才能发挥出 git commit的作用和意义,对于团队开发和生成版本变更日志都很有帮助。但习惯又是也需要制度来监督。

Commitlint

commitlint是一个可以帮我们检查 git commit 所提交信息是否符合conventional commit format(也就是类似上面的格式)的工具,安装方法如下:

npm install --save-dev @commitlint/config-conventional @commitlint/cli

项目目录下创建 commitlint.config.js 文件并写入 module.exports = {extends: ['@commitlint/config-conventional']}。这个文件就是配置文件,可以设置 commitlint 检查规则。具体规则可以参考这里。 我自己写的一个例子:

module.exports = {
    extends: ['@commitlint/config-angular'],
    rules: {
        'type-enum': [
            2,
            'always',
            [
                'WIP',      // 开发中
                'feat',     // 新特性
                'improvement', // 加强现有特性
                'fix',      // 修补bug
                'refactor', // 重构
                'docs',     // 文档
                'test',     // 单元测试
                'config',   // 配置文件
                'style',    // 格式需改
                'perf',     // 性能提升
                'ci',       // ci
                'revert',   // 版本回退
                'chore',    // 其他修改
            ],
        ],
        'type-empty': [2, 'never'],               // type不能为空
        'type-case': [0, 'always', 'lower-case'], // type不限制大小写
        'subject-empty': [2, 'never'],            // subject(简短得描述)不能为空
        'subject-max-length': [1, 'always', 50],  // subject最大长度,超出只会警告,不阻止提交
        'body-leading-blank': [1, 'always'],
		'footer-leading-blank': [1, 'always'],
		'header-max-length': [2, 'always', 72],
      }
};

安装好 commitlint 工具后,可以使用该工具对 commit 信息手动检查,要是想每次 git 提交时自动执行检查,可以配合 husky。husky是一个可以帮我们设置 git hook 的工具,使用它为我们git commit时添加一个hook,提交时就会触发这个hook,执行 commitlint 自动检查我们提交的 commit message,如果不符合规范,可以阻止提交。

使用husky方法:

npm install husky --save-dev

package.json 中添加:

"husky": {
  "hooks": {
    "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  }
},

之后执行提交时就会自动触发 commitlint 工具并使用我们在 commitlint.config.js中设置的规则检查提交的信息是否符合规范。