commitizen + husky 规范git提交信息

前言

你是否有过这样的体验:node

  1. 快下班了,提交代码赶忙溜,一顿啪啪啪,(git add .)(git commit -m "吧拉吧啦")(git push);
  2. 修改的东西有点杂,,不知道提交信息写啥,又是一顿啪啪啪,好了提交了;
  3. 提交一时爽,查找泪两行,想寻当时的某次修改发现无从下手。。。。

有什么需求,就有什么工具,针对这些问题,如今业界用的最多的就是Angular团队使用的规范;经过git commit的时候弹出一个vim编辑器来编辑模板类型的一份提交信息,主要格式以下:git

<type>(<scope>):<subject>
<BlLANK_LINE>
<?body>
<BLANK_LINE>
<?footer>复制代码

  • 第一行为必填项:主要就是 【提交类型(影响范围):简要描述】
  • body为详细描述,我的没怎么用过
  • 页脚为破坏性改变或者关闭了某个issues

安装

我的习惯针对于项目设置,因此直接在项目安装,而非全局配置,原理同样npm

$ npm i -D commitizen cz-conventional-changelog
$ npm i -g commitizen cz-conventional-changelog复制代码

### package.json

"config":{
    "commitizen":{
        "path":"node_modules/cz-conventional-changelog"
    }
}复制代码

这里若是你是使用全局模式安装的话须要在全局根目录下创建.czrc文件,而后文件中输入内容{“path”:"cz-conventional-changelog"}或者键入以下命令:json

echo '{"path":"cz-conventional-changelog"}' > ~/.czrc复制代码

若是你是使用全局安装的那么如今你到项目目录下使用git cz命令就能够看到vim编辑器的弹出内容了,若是是项目级安装,能够到package.json中的scripts命令中配置一条运行命令便可(type的具体类型配置文件介绍)vim

"scripts":{
    commit:"git-cz"
}复制代码


选择了提交类型后,会让你继续选择代码的影响范围bash


选择完影响范围后会让你依次填写简要信息,详细信息,页脚信息,是否提交(不一一律述了,都是写完enter键下一步)编辑器

commitlint校验

进行了上面的操做,其实对于一个自觉地人来讲,已经够了,可是没有约束就表明了自由,自由就有人越界,我若是不按约束提交,照样玩的嗨起,那么怎么给这些自由加一些约束呢?工具

$ npm i -D @commitlint/config-conventional @commitlint/cli复制代码

在项目更目录下创建配置文件 commitlint.config.js 或者 .commitlintrc.js测试

module.exports = {
    extents:[
        "@commitlint/config-conventional"
    ],
    rules:{
    }
}复制代码

你可使用官网的方式测试一下你的提交是否符合规范ui



Husky限制

结合git hook来检验commit message,这样当你的提交不符合规范时就会阻止你提交

$ npm i -D husky复制代码

package.json

"husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS"
    }
  }复制代码

这样当你有不符合规范的时候你将提交不了(我这里是scope为空,拒绝提交)


自定义提交规范

固然大家若是想本身定义提交规范也是能够的,首先要下载自定义规范约束的包替换Angular团队使用的规范。

$ npm i -D commitlint-config-cz  cz-customizable
###而且在项目根目录建立cz-config.js复制代码

commitlint.config.js(rules为我自定义的规则)

module.exports = {    
    extends: [        
        '@commitlint/config-conventional',
        'cz'    
    ],
     rules:{
      // Header 
     'header-max-length': [2, 'always', 200],
      // <type>枚举
      'type-enum': [2, 'always', [
        'init',
        'feat',
        'fix',
        'ui',
        'refactor',
        'replace',
        'deploy',
        'docs',
        'test',
        'chore',
        'style',
        'revert',
        'add',
        'minus',
        'del'
      ]],
      // <type> 不能为空
      'type-empty': [2, 'never'],
      // <type> 格式 小写 
     'type-case': [2, 'always', 'lower-case'],
      // <scope> 不能为空
      'scope-empty': [2, 'never'],
      // <scope> 格式 小写
      'scope-case': [2, 'always', 'lower-case'],
      // <subject> 不能为空
      'subject-empty': [2, 'never'],
      // <subject> 以.为结束标志
      'subject-full-stop': [2, 'never', '.'],
      // <subject> 格式
      // 可选值
      // 'lower-case' 小写 lowercase
      // 'upper-case' 大写 UPPERCASE
      // 'camel-case' 小驼峰 camelCase
      // 'kebab-case' 短横线 kebab-case
      // 'pascal-case' 大驼峰 PascalCase
      // 'sentence-case' 首字母大写 Sentence case
      // 'snake-case' 下划线 snake_case
      // 'start-case' 全部首字母大写 start-case
      'subject-case': [2, 'never', []],
      // <body> 以空行开头
      'body-leading-blank': [1, 'always'],
      // <footer> 以空行开头
      'footer-leading-blank': [1, 'always']
    }}复制代码

package.json

"config": {
    "commitizen": {
      "path": "node_modules/cz-customizable"
    }
  },复制代码

cz-config.js(这是我自定义的配置)

module.exports = {
  types: [
    {      value: 'init',      name: 'init: 初始提交'    },
    {      value: 'feat',      name: 'feat: 增长新功能'    },
    {      value: 'fix',      name: 'fix: 修复bug'    },
    {      value: 'ui',      name: 'ui: 更新UI'    },
    {      value: 'refactor',      name: 'refactor: 代码重构'    },
    {      value: 'release',      name: 'release: 发布'    },
    {      value: 'deploy',      name: 'deploy: 部署'    },
    {      value: 'docs',      name: 'docs: 修改文档'    },
    {      value: 'test',      name: 'test: 增删测试'    },
    {      value: 'chore',      name: 'chore: 更改配置文件'    },
    {      value: 'style',      name: 'style: 样式修改不影响逻辑'    },
    {      value: 'revert',      name: 'revert: 版本回退'    },
    {      value: 'add',      name: 'add: 添加依赖'    },
    {      value: 'minus',      name: 'minus: 版本回退'    },
    {      value: 'del',      name: 'del: 删除代码/文件'    }
  ],
  scopes: [],
  messages: {
    type: '选择更改类型:\n',
    scope: '更改的范围:\n',
    // 若是allowcustomscopes为true,则使用
    // customScope: 'Denote the SCOPE of this change:',
    subject: '简短描述:\n',
    body: '详细描述. 使用"|"换行:\n',
    breaking: 'Breaking Changes列表:\n',
    footer: '关闭的issues列表. E.g.: #31, #34:\n',
    confirmCommit: '确认提交?'
  },
  allowCustomScopes: true,
  allowBreakingChanges: ["feat", "fix"]};复制代码


最后:若是你以为对你有帮助,留下个脚印吧!若是你以为文章有问题,留下点意见吧!

相关文章
相关标签/搜索