Garlic Garlic

规范git commit提交信息

发表于 阅读时长7分钟

前提

公司团队在开发一个新项目的时候,团队成员决定规范提交的git信息,本人自那以后也一直遵守规则,今天有时间,自己摸索一下。

commit message

格式如下

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

message的格式主要分为了三部分:标题行、主体、页脚。

  • 标题行:简单描述更改的范围(scope)和内容(subject),必填。

  • 主体:详细描述做了哪些内容改动,改动的一些思路,选填。

  • 页脚:与版本冲突的代码变化、关闭的issue,选填。

type

type是提交的类型。通常为以下几种

  • feat: 新特性
  • fix: 修复问题
  • refactor: 重构代码
  • docs: 文档相关
  • style: 代码格式调整,不是css样式
  • test: 测试用例
  • chore: 项目构建相关

平时我们完全可以在提交的时候按照以上约定的格式来写。

如果稍微懒一点,可以引入npm工具包来帮我们走这一步流程。

commitizen

借助commitizen来帮助我们生成符合规范的提交信息。

同时需要为commitizen提供一个adaptor,这个adaptor是一个约定好的规范。官网上提供了许多adaptor,我们先选一个 cz-conventional-changelog

我不想全局安装,选择项目安装

npm install commitizen --save-dev
npm install cz-conventional-changelog --save-dev

安装完之后再package.json中添加

"scripts": {
    ...,
    "commit": "git-cz"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-conventional-changelog"
    }
  },

然后我们执行 npm run commit 便会看到引导内容,我们按提示完成提交信息即可。

cz-customizable

如果我们不想用别人约定好的adaptor,我们想自己约定。可以使用cz-customizable

npm i -D cz-customizable

然后将我们之前在package.json中写的config调整为

"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: 'docs',
            name: 'docs: 仅更改文档'
        },
        {
            value: 'style',
            name: 'style: 不影响代码运行的格式更改\n (如空格,格式化代码,分号等)',
        },
        {
            value: 'refactor',
            name: 'refactor: 代码重构',
        },
        {
            value: 'perf',
            name: 'perf: 使项目性能提升的代码',
        },
        {
            value: 'test',
            name: 'test:  添加测试用例'
        },
        {
            value: 'chore',
            name: 'chore: 项目构建、辅助工具等\n 如文档生成等',
        },
        {
            value: 'revert',
            name: 'revert: 回滚代码'
        },
        {
            value: 'WIP',
            name: 'WIP: 待完成的代码'
        },
    ],

    scopes: [],

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

    // it needs to match the value for field type. Eg.: 'fix'
    /*
    scopeOverrides: {
      fix: [

        {name: 'merge'},
        {name: 'style'},
        {name: 'e2eTest'},
        {name: 'unitTest'}
      ]
    },
    */
    // override the messages, defaults are as follows
    messages: {
        type: "选择提交的类型:",
        scope: '\n指明更改的范围 (可选):',
        // used if allowCustomScopes is true
        customScope: '指明此次修改的范围:',
        subject: '针对此次修改,填写一个简单明了的说明:\n',
        body: '提供一个详细的说明 (可选). 用 "|" 来换行:\n',
        breaking: '列出此次不兼容的变更 (可选):\n',
        footer: '列出关闭的ISSUES (可选). 比如: #31, #34:\n',
        confirmCommit: '确定使用以上内容来提交本次commit吗?',
    },

    allowCustomScopes: true,
    allowBreakingChanges: ['feat', 'fix'],
    // skip any questions you want
    skipQuestions: [],

    // limit subject length
    subjectLimit: 100,
    // breaklineChar: '|', // It is supported for fields body and footer.
    // footerPrefix : 'ISSUES CLOSED:'
    // askForBreakingChangeFirst : true, // default is false
};

当我们执行 npm run commit 时,便如下图

commitlint

有时我们为了节省时间,没有使用 npm run commit 来走以上的流程,直接提交自定义commit信息。虽然可以提交成功,但我们之前的努力似乎就白费了。因为一旦开始随意提交,后面便不会再想按流程来走。因此,我们需要校验提交的信息,如果不符合规范,直接拒绝你的提交。

commitlint可以帮我们校验,同样它也需要一份配置文件。

首先安装commitlint

npm i -D @commitlint/cli

然后安装校验的配置

npm i -D @commitlint/config-conventional

然后我们创建配置文件

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

commitlint.config.js 也可以命名为 .commitlintrc.js.commitlintrc.json.commitlintrc.yml ,甚至可以在package.json中配置。

commitlint-config-cz

就如刚才我们使用了自定义的adaptor来约定commit的格式,我们也可以自定义校验的规则

npm i -D commitlint-config-cz

然后我们修改刚才生成的校验配置

module.exports = { 
  extends: ["cz"] 
};

查看官网rules, 我们随便在 commitlint.config.js 中添加一些rules

module.exports = {
    extends: ["cz"],
    rules: {
        'type-enum': [2, 'always', ['feat', 'fix', 'refactor', 'docs', 'chore', 'style']],
        'scope-empty': [2, 'never'],
        'subject-empty': [2, 'never'],
        'type-empty': [2, 'never']
    }
};

这里我主要是规定了主要的标题行的内容不能为空。

husky

使用commitlint需要搭配husky使用

npm install --save-dev husky

然后在package.json中添加配置

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

这样当我们提交时,如果提交的信息不符合规范,便会提示报错。比如我随便写了个abcd,就报错了,如下图。

总结

整体的大体流程如上,周末愉快。