强制检验代码约定式提交规范的方法

198 阅读3分钟

一、背景

约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。如何确保团队内所有人提交代码都使用了约定式提交规范,这就需要使用强制校验规则来约束,符合约定式提交规范的才能成功提交代码。

二、约定式提交结构

提交说明的结构如下所示:约定式提交详细介绍文档

<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插件来批量快速开启。