为什么要制定代码提交规范?
俗话说,国有国法,家有家规,公司有公司的规章制度。那么,小到我们团队,也需要有一定的开发规范,否则将代码混乱,后期查看代码日志log时,五花八门,非常不利于同事阅读新鲜,导致后期维护难度大。
在我们日常团队协作开发中,都要把自己写的功能模块代码提交到github或者gitee上,以便团队人员进行协作开发,那么我们就需要制定一系列的代码规范,促使团队形成统一规范的提交代码风格,提高工作效率。
一般大产都会有一套完善的提交代码规范,特别是一些开源的项目中,都能看到commit message 是非常严谨,非常一致的。
那业界中,公认的commit message 规范是怎么样的呢?
1. commitizen
AngularJS在 github上 的提交记录被业内许多人认可,逐渐被大家引用。
commit 格式规范
<type类型>(<scope 可选作用域>): <subject 描述>
<BLANK LINE>
<body 可选的正文>
<BLANK LINE>
<footer 可选的脚注>
大致主要分为三个部分(每个部分中间用空行分割):
- 标题行: 必填, 描述主要修改类型和内容
- 主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等
- 页脚注释: 可以写注释,BUG 号链接 或 Closed Issues
- 标题行中的type(必须):commit 类型,只能填写如下类型:
- feat: 新功能、新特性
- fix: 修改 bug
- perf: 更改代码,性能优化
- refactor: 代码重构(重构,在不影响代码内部行为、功能下的代码修改)
- docs: 文档修改
- style: 代码格式修改, 注意不是 css 修改(例如分号修改)
- test: 测试用例新增、修改
- build: 影响项目构建或依赖项修改
- revert: 恢复上一次提交
- ci: 持续集成相关文件修改
- chore: 其他修改(不在上述类型中的修改)
- release: 发布新版本
- workflow: 工作流相关文件修改
- scope(可选): 用于说明commit 影响的范围, 比如: global, common, route, component, utils, build...
- subject: commit 的简短概述,不超过50个字符。
- body: commit 具体修改内容, 可以分为多行。
- footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接。
例如如下示例:
// 示例1
fix(global):修复checkbox不能复选的问题
// 示例2
fix(common): 修复头部区域logo问题
// 示例1
feat: 添加资产管理模块
增加资产列表、搜索。
需求No.181 http://xxx.xxx.com/181。
约定式提交规范
内容来自(www.conventionalcommits.org/zh-hans/v1.…)
- 每个提交都必须使用类型字段前缀,它由一个名词组成,诸如
feat或fix,其后接一个可选的作用域字段,以及一个必要的冒号(英文半角)和空格。 - 当一个提交为应用或类库实现了新特性时,必须使用
feat类型。 - 当一个提交为应用修复了
bug时,必须使用fix类型。 - 作用域字段可以跟随在类型字段后面。作用域必须是一个描述某部分代码的名词,并用圆括号包围,例如:
fix(parser): - 描述字段必须紧接在类型/作用域前缀的空格之后。描述指的是对代码变更的简短总结,例如:
fix: array parsing issue when multiple spaces were contained in string. - 在简短描述之后,可以编写更长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后。
- 在正文结束的一个空行之后,可以编写一行或多行脚注。脚注必须包含关于提交的元信息,例如:关联的合并请求、Reviewer、破坏性变更,每条元信息一行。
- 破坏性变更必须标示在正文区域最开始处,或脚注区域中某一行的开始。一个破坏性变更必须包含大写的文本
BREAKING CHANGE,后面紧跟冒号和空格。 - 在
BREAKING CHANGE:之后必须提供描述,以描述对 API 的变更。例如:BREAKING CHANGE: environment variables now take precedence over config files. - 在提交说明中,可以使用
feat和fix之外的类型。 - 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有
BREAKING CHANGE必须是大写的。 - 可以在类型/作用域前缀之后,: 之前,附加
!字符,以进一步提醒注意破坏性变更。当有!前缀时,正文或脚注内必须包含BREAKING CHANGE: description
可通过参考资料进行查阅。
2. 通过git pre-commit钩子函数进行自动化提交验证
验证 git commit 规范,主要是通过git的pre-commit钩子函数进行处理的。当然,还需要安装一个辅助的工具来帮助进行验证。
下载安装辅助工具 husky
npm i husky -D
在 package.json 中进行配置 husky
"husky": {
"hooks": {
"pre-commit": "npm run lint",
"commit-msg": "node scripts/verifyCommit.js",
"pre-push": "npm test"
}
}
在项目中创建一个 scripts 文件夹,并在文件夹下建立一个 verifyCommit.js 文件,输入如下代码:
const chalk = require('chalk')
const msgPath = process.env.HUSKY_GIT_PARAMS
const msg = require('fs')
.readFileSync(msgPath, 'utf-8')
.trim()
const commitRE = /^(feat|fix|docs|style|refactor|perf|test|workflow|build|ci|chore|release|workflow)(\(.+\))?: .{1,50}/
if (!commitRE.test(msg)) {
console.log(msg)
console.error(`
${chalk.bgRed.white(' ERROR ')} ${chalk.red('不合法的 commit 消息格式。')} \n\n
请查看 git commit 提交规范:${chalk.red('git-commit-style.md')}
`)
process.exit(1)
}
让我们来了解下上述代码中各个钩子的含义:
"pre-commit": "npm run lint",在git commit之前先执行npm run lint代码规范检查。"commit-msg": "node scripts/verifyCommit.js",在git commit时执行脚本verifyCommit.js验证 commit 消息。如果不符合脚本中定义的格式,将会报错,并提示查看相关的规范文档。"pre-push": "npm test",在你执行git push将代码推送到远程仓库前,执行npm test进行测试。如果测试失败,将不会执行这次推送。
到此,应该大概了解了 git commit 代码提交规范,相信大家有了一份统一的规范,效率会大大的提高。
参考文档: github.com/woai3c/Fron…