一、背景
约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。如何确保团队内所有人提交代码都使用了约定式提交规范,这就需要使用强制校验规则来约束,符合约定式提交规范的才能成功提交代码。
二、约定式提交结构
提交说明的结构如下所示:约定式提交详细介绍文档
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
译文:
<类型>[可选 范围]: <描述>
[可选 正文]
[可选 脚注]
提交说明包含了下面的结构化元素,以向类库使用者表明其意图。
1.fix: 类型 为 fix 的提交表示在代码库中修复了一个 bug(这和语义化版本中的 PATCH 相对应)。
2.feat: 类型 为 feat 的提交表示在代码库中新增了一个功能(这和语义化版本中的 MINOR 相对应)。
3.BREAKING CHANGE: 在脚注中包含 BREAKING CHANGE: 或 <类型>(范围) 后面有一个 ! 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR 相对应)。 破坏性变更可以是任意 类型 提交的一部分。
4.除 fix: 和 feat: 之外,也可以使用其它提交 类型 ,例如 @commitlint/config-conventional(基于 Angular 约定)中推荐的 build:、chore:、 ci:、docs:、style:、refactor:、perf:、test:,等等。
5.脚注中除了 BREAKING CHANGE: <description> ,其它条目应该采用类似 git trailer format 这样的惯例。
其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含 BREAKING CHANGE)。 可以为提交类型添加一个围在圆括号内的范围,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.
三、本地强校验方法
写一个hook git提交的插件,当提交代码的时候校验提交说明文案是否符合约定式提交的规则,若符合约定式提交规范则允许提交,否则提示不符合约定式提交规范的详细错误,终止提交代码。
hook git提交的核心代码如下:
#!/usr/bin/env bash
# 检查文件是否存在
if [ -f "$1" ]; then
echo "提交描述如下:"
cat "$1" # 打印文件内容
else
echo "Error: File $1 does not exist."
exit 1
fi
# 定义约定式提交的正则表达式
commit_regex='^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)((.+))?: .{1,50}'
# 读取提交信息
commit_msg=$(cat "$1")
if ! [[ $commit_msg =~ $commit_regex ]]; then
echo "错误: 提交信息不符合约定式提交规范。"
echo "正确格式应为: <type>[(scope)]: <description>"
echo "例如: feat(parser): add ability to parse arrays"
exit 1
fi
echo "提交信息符合约定式提交规范"
核心思路:在提交代码的时候获取git提交的描述信息,使用正则表达式校验提交描述信息是否符合约定式提交规范。将shell脚本命名为:commit-msg。放到当前项目的.git/hooks文件夹下,没此目录则创建,详细如下图:
四、本地强校验结果展示
提交代码不符合约定式提交规范,拒绝提交代码,并且打印提示信息。
1、命令行提交:
2、SourceTree提交:
五、远程强校验方法
1、代码仓库开启提交信息格式检查,具体操作方式:在代码仓库设置-->Push Rules-->提交信息格式检查-->Coding约定式提交规则。此开关开启并保存设置即可。
2、若代码仓库非常多,都需要开启强校验代码约定式提交规范,则可以使用Tampermonkey插件来批量快速开启。