Git之借助Commitizen规范化提交代码
创始人
2024-02-15 02:26:09

文章目录

    • 一、约定式提交规范
      • 1.1 概述
      • 1.2 规范
      • 1.3 好处
    • 二、Commitizen
      • 2.1 安装
      • 2.2 安装并配置cz-customizable依赖
        • 2.2.1 安装依赖
        • 2.2.2 配置package.json
        • 2.2.3 添加cz-config配置文件
      • 2.3 使用
      • 2.4 问题

一、约定式提交规范

1.1 概述

约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能、修复和破坏性变更, 使这种惯例与 SemVer 相互对应,官网直达。

提交说明的结构如下所示:

[optional scope]: [optional body][optional footer(s)]

翻译过来就是:

<类型>[可选 范围]: <描述>[可选 正文][可选 脚注]

如图:
在这里插入图片描述

提交说明包含了下面的结构化元素,以向类库使用者表明其意图:

  • fix: 类型 为fix的提交表示在代码库中修复了一个bug(这和语义化版本中的PATCH相对应)
  • feat: 类型 为feat的提交表示在代码库中新增了一个功能(这和语义化版本中的MINOR相对应)
  • BREAKING CHANGE: 在脚注中包含BREAKING CHANGE: 或 <类型>(范围) 后面有一个 ! 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR 相对应)。 破坏性变更可以是任意 类型 提交的一部分
  • fix: 和 feat: 之外,也可以使用其它提交 类型 ,例如 @commitlint/config-conventional(基于 Angular 约定)中推荐的 build:、chore:、 ci:、docs:、style:、refactor:、perf:、test:
  • 脚注中除了BREAKING CHANGE: ,其它条目应该采用类似 git trailer format 这样的惯例。

其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含BREAKING CHANGE)。 可以为提交类型添加一个围在圆括号内的范围,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.

1.2 规范

本文中的关键词·“必须(MUST)”、“禁止(MUST NOT)”、“必要(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)” 和 “可选(OPTIONAL)” ,其相关解释参考RFC 2119

  • 每个提交都必须使用类型字段前缀,它由一个名词构成,诸如featfix, 其后接可选的范围字段,可选的!,以及必要的冒号(英文半角)和空格
  • 当一个提交为应用或类库实现了新功能时,必须使用feat类型。
  • 当一个提交为应用修复了bug时,必须使用fix类型。
  • 范围字段可以跟随在类型字段后面。范围必须是一个描述某部分代码的名词,并用圆括号包围,例如: fix(parser):
  • 描述字段必须直接跟在 <类型>(范围) 前缀的冒号和空格之后。 描述指的是对代码变更的简短总结,例如: fix: array parsing issue when multiple spaces were contained in string
  • 在简短描述之后,可以编写较长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后
  • 提交的正文内容自由编写,并可以使用空行分隔不同段落
  • 在正文结束的一个空行之后,可以编写一行或多行脚注。每行脚注都必须包含 一个令牌(token),后面紧跟:#作为分隔符,后面再紧跟令牌的值(受 git trailer convention 启发)
  • 脚注的令牌必须使用 - 作为连字符,比如 Acked-by (这样有助于 区分脚注和多行正文)。有一种例外情况就是BREAKING CHANGE,它可以被认为是一个令牌。
  • 脚注的值可以包含空格和换行,值的解析过程必须直到下一个脚注的令牌/分隔符出现为止。
  • 破坏性变更必须在提交信息中标记出来,要么在 <类型>(范围) 前缀中标记,要么作为脚注的一项
  • 包含在脚注中时,破坏性变更必须包含大写的文本BREAKING CHANGE,后面紧跟着冒号、空格,然后是描述,例如:BREAKING CHANGE: environment variables now take precedence over config files
  • 包含在<类型>(范围)前缀时,破坏性变更必须通过把 ! 直接放在:前面标记出来。 如果使用了 !,那么脚注中可以不写 BREAKING CHANGE:, 同时提交信息的描述中应该用来描述破坏性变更
  • 在提交说明中,可以使用 feat 和 fix 之外的类型,比如:docs: updated ref docs.
  • 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有BREAKING CHANGE必须是大写的
  • BREAKING-CHANGE作为脚注的令牌时必须是BREAKING CHANGE的同义词

1.3 好处

  • 自动化生成 CHANGELOG。
  • 基于提交的类型,自动决定语义化的版本变更。
  • 向同事、公众与其他利益关系者传达变化的性质。
  • 触发构建和部署流程。
  • 让人们探索一个更加结构化的提交历史,以便降低对你的项目做出贡献的难度

二、Commitizen

从第一章中了解到约定式提交规范,我们知道如果严格按照约定式提交规范来手动进行代码的提交,那会是一件非常痛苦的事情,但是Git提交规范处理又势在必行,那如何处理呢?

接下来要介绍的commitizen就是用来做Git提交规范化的工具,在保证代码按照规范提交的同时,又可以大大提高提交效率。

commitizen仓库名为cz-cli,其提供了一个git cz的命令来替代git commit,简单介绍一句话介绍就是:

当使用commentizen进行代码提交(git commit)时,commitizen会提交我们在提交时填写的所有必须的字段。

话不多说,直接上手体验下吧。

2.1 安装

通过如下命令安装commitizen

npm install commitizen -g

2.2 安装并配置cz-customizable依赖

2.2.1 安装依赖

在项目根目录下,安装cz-customizable依赖,如下:

npm i cz-customizable -D

2.2.2 配置package.json

packge.json中添加刚安装的依赖,如下:

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

2.2.3 添加cz-config配置文件

在项目根目录下创建.cz-config.js自定义提示文件,如下:

module.exports = {// 可选类型types: [{ value: 'feat', name: 'feat:     新功能' },{ value: 'fix', name: 'fix:      修复' },{ value: 'docs', name: 'docs:     文档变更' },{ value: 'style', name: 'style:    代码格式(不影响代码运行的变动)' },{value: 'refactor',name: 'refactor: 重构(既不是增加feature,也不是修复bug)'},{ value: 'perf', name: 'perf:     性能优化' },{ value: 'test', name: 'test:     增加测试' },{ value: 'chore', name: 'chore:    构建过程或辅助工具的变动' },{ value: 'revert', name: 'revert:   回退' },{ value: 'build', name: 'build:    打包' }],// 消息步骤messages: {type: '请选择提交类型:',customScope: '请输入修改范围(可选):',subject: '请简要描述提交(必填):',body: '请输入详细描述(可选):',footer: '请输入要关闭的issue(可选):',confirmCommit: '确认使用以上信息提交?(y/n/e/h)'},// 跳过问题skipQuestions: ['body', 'footer'],// subject文字长度默认是72subjectLimit: 72
}

2.3 使用

此时,我们在提交代码时,就不需要再使用git commit了,而是使用git cz来执行,提交过程如下:
在这里插入图片描述

2.4 问题

借助commitizen工具可以简单快捷完成代码规范化提交,新问题又来了,同一个团队的不同开发同学其提交不能保证都是符合规范的,那么如何保证团队都是符合规范提交呢?

这就需要借助于GitHooks完成了,下篇文章来搞一下。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...