hushicai / hushicai.github.io

Blog
https://hushicai.github.io
27 stars 1 forks source link

Git提交规范工作流 #21

Open hushicai opened 5 years ago

hushicai commented 5 years ago

良好的Git Commit Message有助于code review、团队协作、输出changelog等,然而实际工作中却常常被忽略。

本文主要介绍一些常用的工具链,帮助团队重视和编写规范化的commit message。

规范

目前社区使用较多的是 Angular 团队的规范,继而衍生了 Conventional Commits specification

Commitizen

commitizen/cz-cli可以帮助我们生成符合规范的Commit Message。

一般有两种安装方式,全局安装和项目级安装。

在这里,我们选择项目级安装:

npm i -D commitizen
./node_modules/.bin/commitizen init cz-conventional-changelog --save-dev --save-exact

package.json中会生成以下内容:

{
  "devDependencies": {
    "commitizen": "^2.10.1",
    "cz-conventional-changelog": "^2.1.0"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }
}

package.json中配置一个commit script:

{
  "scripts": {
    "commit": "git-cz"
  }
}

现在我们就可以用cz来生成符合规范的commit message:

image

如果你不想通过npm scripts的方式来commit,你也可以全局安装一个commitizen:

npm i -g commitizen

然后可以直接用cz来commit:

git cz

Commitlint

前文提到,我们需要借助cz才能自动生成commit message,那如果有些同事不用呢?直接git commit -m "xxx"怎么办?

这就需要用到commitlint,它可以帮助我们 lint commit messages,如果我们提交的log不符合规范,直接拒绝提交。

安装:

npm i -D @commitlint/config-conventional @commitlint/cli
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

校验commit message的最佳方式是采用git hook,所以需要配合Husky

Husky

Husky可以帮助我们更好地管理git hooks。

安装:

npm i husky@next --save-dev

package.json中添加配置:

{
  "husky": {
    ...
    "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  }
}

现在就可以和commitlint一起愉快地校验commit message了:

image

如上图所示,git commit被拦截了,log不符合规范,直接拒绝提交!

所以还是建议大家用cz来提交,手工填写的commit message可能会被拒绝!

standard-version

通过以上工具, 我们的 commit message 应该是符合规范的。

现在我们就可以借助 standard-version, 自动生成changelog,甚至是语义化的版本号(Semantic Version)。

安装:

npm i standard-version --save-dev

package.json中配置:

{
  "standard-version": {
    "skip": {
      "commit": true
    }
  }
}

效果:

image

可以看到,它会自动更新版本,生成changelog,以及打tag。

image

如果我们继续commit,再次release时,standard-version会基于 Semantic Version 生成下一个版本,同时生成上一个tag到此时为止的commit changelog:

image