Git之借助Commitizen规范化提交代码

news2025/7/27 17:10:23

文章目录

    • 一、约定式提交规范
      • 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 相互对应,官网直达。

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

<type>[optional scope]: <description>

[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: <description> ,其它条目应该采用类似 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),后面紧跟:<space> 或 <space>#作为分隔符,后面再紧跟令牌的值(受 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文字长度默认是72
  subjectLimit: 72
}

2.3 使用

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

2.4 问题

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6 入门教程 26 编程风格 26.4 对象 26.5 数组 26.6 函数

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程26 编程风格26.4 对象26.5 数组26.6 函数26 编程风格 26.4 对象 单行定义的对象&#xff0c;最后一个成员不以逗号结尾。多…

流媒体传输 - RTSP 协议

概述 协议简介 RTSP RTSP (Real-Time Stream Protocol) 实时流传输协议是一种基于文本的应用层协议&#xff0c;常被用于 建立的控制媒体流的传输&#xff0c;该协议用于 C/S 模型 , 是一个 基于文本 的协议&#xff0c;用于在客户端和服务器端建立和协商实时流会话。 RTP …

JS语句完全攻略

JavaScript 语言定义了 20 套&#xff08;或个&#xff09;语句命令&#xff0c;分别执行不同的操作。 以用途划分&#xff0c;JavaScript 语句可以分为&#xff1a;声明、分支控制、循环控制、流程控制异常处理和其他。 以结构划分&#xff0c;JavaScript 语句又可以分为单句…

【Python】基础知识(语句,函数)

目录Python基础语法接上次的知识点补充顺序语句条件/分支语句语法格式空语句 pass循环语句while 循环For循环continue和break函数语法格式调用函数/使用函数函数参数函数返回值变量作用域函数执行过程链式调用嵌套调用函数递归参数默认值关键字参数写在前面&#x1f34e;&#…

全双工物联网远程控制门禁设计方案

远程控制物联网方案 (此方案成本250元~300元优点是远低于产家报价400&#xff5e;500,使用自家服务器扩展成本低) 组装后连线效果实物图 网关配置 工具见下面产品说明 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP…

照片人像模糊怎么调?两分钟教会你

有时候我们在拍摄一些照片的时候&#xff0c;可能会因为一些特殊原因而导致照片中的人脸出现模糊的情况&#xff0c;从而使我们无法对照片进行浏览&#xff0c;这时最简单的方法就是借助一些软件来修复模糊的人脸照片&#xff0c;那你们知道如何利用这些软件进行操作吗&#xf…

机器视觉_HALCON_1.了解HALCON

文章目录HALCON概述1. 关于HALCON2. HALCON XL3. 了解HALCON3.1. 通用性说明3.2. 安装HALCON3.3. 继续了解HALCON的第一步4. 更多HALCON资料5. 结语HALCON概述 1. 关于HALCON HALCON是MVTec公司的一款软件产品。 它是一款风靡全球的、用于机器视觉的标准软件&#xff0c;并带…

React - Ant Design3.x版本安装使用,并按需引入和自定义主题

React - Ant Design3.x版本安装使用&#xff0c;并按需引入和自定义主题一. 安装使用 antd二&#xff0e;antd 高级配置安装 react-app-rewired&#xff0c;对 create-react-app 的默认配置进行自定义安装 babel-plugin-import &#xff0c;按需加载组件代码和样式自定义主题An…

ssh外网访问内网服务器

现在有这样一个情况&#xff0c;实验室有自己的服务器&#xff08;内网&#xff09;&#xff0c;并且有相关老师进行维护&#xff08;公网&#xff09;&#xff0c;我们可以在内网用内网ip访问服务器&#xff0c;如果我们在家里只能通过公网进行登录。但是我在实验室有一个小服…

Python学习基础笔记十一——编码

1、Python编码解码&#xff1a; 文件转换为二进制&#xff0c;就是编码。 二进制转换为文本&#xff0c;就是解码。 2、ASCII编码&#xff1a; 字符‘a’在ASCII码表中的对应的数据就是97&#xff0c;二进制为1100001。 # 查看‘a’的ASCII编码 print(ord(a))# 转换为二进制…

04.OpenWrt-连接有线网络

04.OpenWrt-连接有线网络 路由器作为重要的网络设备不光可以连接网络,也可是通过有线或者无线的方式给其他设备连接网络. 4.1 网络的基础知识 4.1.1 常用的网络设备 光调制解调器:俗称 光猫 .现在使用的基本都是光纤入户,光纤中传递的是光信号,进过光猫的转换为电信号.安装…

Golang Channel 实战技巧和说明

文章目录Golang Channel 实战技巧和说明Channel 的一些实战说明关于 close Channelclose Channel 的一些说明v, ok : <-ch 判断是否 close优雅判断是否 close 的封装for-range 读取 Channel 数据select 读写 Channel 数据Channel 的读写超时机制【select timeout】TryEnque…

180H_FPGA时钟结构

PLL 端口信号解释 信号名含义PLL_PWDpower downpll_rst复位PLLclkin_dsel0:clkin1作为参考时钟;1:clkin2作为参考时钟clkfb外部反馈时钟输入dyn_idiv[5:0]动态 input divider&#xff08;输入分频器&#xff09; 分频系数 0&#xff1a;64分频&#xff1b;1:63分频&#xff1b…

HTML+CSS-项目:学成在线

项目&#xff1a;学成在线 Date: September 9, 2022 Summary: 创建根目录、创建网页布局 0. 项目预览&#xff1a; 1. 创建根目录&#xff1a; 目标&#xff1a;创建项目根目录 根目录&#xff1a;网站的第一级文件夹 根目录&#xff1a; 图片文件夹: images样式文件夹: C…

redis 的java客户端 基础(一)

目录 一、redis的客户端语言支持 二、Jedis快速入门 2.1 Jedis连接池 2.1.1 创建Jedis的连接池 三、SpringDataRedis 3.1 快速入门SpringDataRedis 一、redis的客户端语言支持 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/resources/…

[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话

换行字符 回忆上次内容 struct包可以让我们使用封包格式 把数字封包到字节里 pack函数负责封包unpack函数负责解封 我们通过封到不同的字节状态 遍历了一次ascii码还是有那片黑色的区域 好像是一片黑暗森林&#xff01;那里面到底有些什么秘密&#xff1f;&#x1f914; 我们这…

2022大厂面试秘籍Java岗:中间件+算法+HTTP+线程+虚拟机+分布式

前言 很多朋友对面试不够了解&#xff0c;不知道如何准备&#xff0c;对面试环节的设置以及目的不够了解&#xff0c;因此成功率不高。通常情况下校招生面试的成功率低于1%&#xff0c;而社招的面试成功率也低于5%&#xff0c;所以对于候选人一定要知道设立面试的初衷以及每个…

CSS 选择器

目录 1、导语 2、css基本选择器 1&#xff09;、标签选择器 2&#xff09;类选择器 3&#xff09;ID选择器 4&#xff09;通配符选择器 3、css组合选择器 1&#xff09;标记类别选择器&#xff08;交集选择器&#xff09; 2&#xff09;后代选择器 3&#xff09;子选择器 4…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-2 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-2 平面机构离散运动鞍点综合2.3 鞍点圆2.3.1 鞍圆与二副连架杆R-R2.3.2 鞍圆误差2.3.3 四位置鞍圆2.3.4 五位置鞍圆2.3.5 多位置鞍圆2.3 鞍点圆 平面连杆机构中…

浅谈JVM(面试常考题)

文章目录JVM简介JVM 执行流程JVM运行时数据区(内存布局)程序计数器(线程私有)Java虚拟机栈(线程私有)堆(线程共享)方法区(线程共享)小结JVM类加载类加载的具体过程LoadingLinkingVerificationPreparationResolutionInitialization类加载的执行顺序双亲委派模型JVM中的垃圾回收机…