从零到一实现对Git Commit Message规范和校验,并生成changelog文档

1,115 阅读4分钟

项目地址: gitHub

当团队开始执行Angular团队Git Message提交规范,团队成员如何遵守,难道要每次codeReview团队成员的git message,很显然成效很低,而且我们在使用命令commit -m 里书写的时候,很可能因字符拼写错误、存在中英文标点符号导致不统一,解决以下两个问题,基本上保证了团队提交message符合规范。

  • 如何能够不用手写,直接通过命令行生成,减少容错率

  • 提交的message,在pre commit阶段校验下,不符合规范抛出错误,不允许提交

Angular规范介绍

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

type

必填项 用于说明 commit 的类别,目前我们团队包含如下:

  • feat: 新功能
  • fix: bug修复
  • refactor: 代码修改,该修改既不是bug修复也不是添加新功能
  • style: 不影响代码含义的更改(空白、格式、缺少分号等)
  • docs: 修改文档
  • perf: 修改代码以提高性能
  • test: 添加缺失的测试或纠正现有测试
  • build: 影响构建系统或外部依赖的修改
  • ci: 对CI配置文件和脚本的更改
  • chore: 更改配置文件(其他的修改,不修改src源码也不修改测试源码)
  • revert: 版本回退

scope

选填项用于说明 commit 影响的范围,根据项目而定,如services、功能模块、单元测试、utils等

subject

必填项 commit 目的的简短描述,结尾不要有句号(。)

body

选填项修改的背景(为什么做这次修改),说明修改逻辑,可多行

footer

选填项有以下两种情况

  • 针对不兼容变动修改,Footer部分为Breaking Change列表
  • 关闭 Issue,例如:Closes #001, #002, #003

Commitizen-交互式命令插件,减少容错率

通过交互式命令,自动生成`Commit Message 文档

安装, 推荐全局安装,这样就可以在Git bashCmdVscodePowerShell均可以使用

npm install -g commitizen

在项目中安装

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

// 如果使用yarn:
commitizen init cz-conventional-changelog --yarn --dev --exact

cz-conventional-changelog: 执行git cz 命令出现交互式命令适配器 在项目中安装完成后,会在package.json中加入如下:

// package.json
"devDependencies": {
    "cz-conventional-changelog": "^3.3.0",
},
"config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }

执行git cz命令如下:

cz1.jpg

改命令行还不够友好,我们希望选项是符合自己团队规范的适配器,

cz-customizable-配置适合自己团队适配器

commit格式适配器,改为项目中适配器,而不使用Angular官方适配器 文档

安装

npm install cz-customizable -D

package.jsonconfig修改配置

"config": {
    "commitizen": {
      "path": "node_modules/cz-customizable"
    }
  }

在根目录下创建.cz-config.js

// .cz-config.js
module.exports = {
  types: [
    { value: 'feat', name: 'feat: 新功能' },
    { value: 'fix', name: 'fix: bug修复' },
    { value: 'refactor', name: 'refactor: 代码修改,该修改既不是bug修复也不是添加新功能' },
    { value: 'style', name: 'style: 不影响代码含义的更改(空白、格式、缺少分号等)' },
    { value: 'docs', name: 'docs: 修改文档' },
    { value: 'perf', name: 'perf: 修改代码以提高性能' },
    { value: 'test', name: 'test: 添加缺失的测试或纠正现有测试' },
    { value: 'build', name: 'build: 影响构建系统或外部依赖的修改(示例范围:gulp, broccoli, npm)' },
    { value: 'ci', name: 'ci: 对CI配置文件和脚本的更改' },
    { value: 'chore', name: 'chore: 更改配置文件(其他的修改,不修改src源码也不修改测试源码)' },
    { value: 'revert', name: 'revert: 版本回退' },
    // { value: 'add', name: 'add: 添加依赖' },
    // { value: 'del', name: 'del: 删除代码/文件' },
    // { value: 'init', name: 'init: 初始提交' },
    // { value: 'ui', name: 'ui: 更新UI' },
  ],
  scopes: [],
  messages: {
    type: '<type>选择更改类型:\n',
    scope: '<scope>更改的范围:\n',
    subject: '<subject>简短描述:\n',
    body: '<body>详细描述. 使用"|"换行:\n',
    breaking: 'Breaking Changes列表:\n',
    footer: '<footer>关闭的issues列表. E.g.: #31, #34:\n',
    confirmCommit: '确认提交?',
  },
  // allowcustomscopes为true,在 scope 选择的时候,会有 empty 和 custom 可以选择,empty:空;custom:自己输入
  allowCustomScopes: true,
  // 如上设置为 ['feat', 'fix'],只有我们type选择了 feat 或者是 fix,才会询问我们 breaking message
  allowBreakingChanges: ['feat', 'fix'],
  // 描述的长度限制
  subjectLimit: 100,
};

执行git cz命令如下:

cz2.jpg

commitlint-校验commit message信息

安装

npm install @commitlint/cli @commitlint/config-conventional commitlint-config-cz -D

在项目gitHooks钩子中做校验,配置如下

"gitHooks": {
    "commit-msg": "commitlint  --config .commitlintrc.js -e -V", // commit message校验
    "pre-commit": "lint-staged"
 },

新建.commitlintrc.js加入校验配置

module.exports = {
  extends: ['@commitlint/config-conventional', 'cz'],
  rules:{
    // 自定义规则
  },
};

注意:含有emoji开头校验为不合法 使用commit -m 写一个错误的message,校验如下:

03.jpg

conventional-changelog-cli -根据message生成changelog文档

生成的文档中只包含tagfeatfix记录 注意:含有emoji开头将不会加入到changelog中 安装

npm i conventional-changelog-cli -D

package.json中配置scripts

// package.json
"scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
    "createlog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"
}
  • changelog: 在顶部追加写入到changelog文档中
  • createlog: 根据git message从新生成changelog文档 执行命令npm run createlog,如图:

cz4.jpg

结束

至此开头两个问题已完美解决,由于有校验工具,changelog的文档也会非常规范,前端同学可以更加愉快的玩耍了。。。

参考文档

cz-cli

commitlint

规范你的 commit message 并且根据 commit 自动生成 CHANGELOG.md