使用git的commit-msg实现commit规范校验

不立规矩,不成方圆。团队协作,规范很重要。

背景

git每次提交代码都应该写上commit message,否则就不允许提交,一般来说写commit message应该清晰明了,能够具体的说明

  • 本次做了什么操作
  • 操作的目的是什么
  • 影响了什么范围。

在日常开发中,大家的commit message千奇百怪,有中文的,有英文的,有图标的,各式各样。这就导致了后续代码维护成本变得特别大,有时候自己进行代码复盘都不知道之前的fix bug修改的到底是什么。基于以上的问题,希望在每次commit message提交的时候进行规范校验,让规范更好的服务于质量,一方面提升commit message的质量,另一方面也提升后期代码维护的效率。

这里使用git原生的hooks来实现commit监听,当然也可以使用第三方如husky、pre-commit、commitizen(配合conventional-changelog-cli生成日志,配合cz-conventional-changelog 生成历史)。

使用git hooks监听commit

在.git文件中可以看到有很多的钩子,我们可以在项目根目录下,打开终端输入如下命令:


# 进入git文件
cd .git
 
# 进入钩子文件
cd hooks
 
# 查看所有钩子
ls -a

所有的钩子如下图:

image.png

这里只需要使用到commit-msg钩子,我们回到根目录下,找到package.json文件,在最下面新增一个钩子指令

{
  "name": "项目名称",
  "version": "1.1.1",
  "scripts": {
    // 指令
  },
  "dependencies": {
    // 依赖
  },
  "gitHooks": {
    "commit-msg": "node ./git/index.ts"
  }
}

编写钩子函数

根据指令指向的地址,创建一个git文件夹,在文件下新建一个index.ts文件,写入如下内容:

const chalk = require("chalk")
const msgPath = process.env.GIT_PARAMS
const msg = require("fs")
.readFileSync(msgPath, "utf-8")
.trim()
const commitRE = /^(revert: )?(create|fix|feat|chore|refactor|hotfix|revert|update|build|test|save)(\(.+\))?: .{1,50}/
chalk.level = 1
if (!commitRE.test(msg)) {
  console.log()
  console.log(
    `${chalk.bgRed.white(" ERROR ")} ${chalk.bold.red(
      `无效的commit提交格式`
    )}\n\n` +
    chalk.red(
      `请遵循正确的格式提交. 例如: ` +
      chalk.underline.red(`git commit -m "feat:完成游戏详情"\n`)
    )
  )
  console.table([
    {
      [chalk.cyan("注释")]: "新建项目",
      [chalk.cyan("commit:description")]: `create:创建 XXX项目`
    },
    {
      [chalk.cyan("注释")]: "修复 bug",
      [chalk.cyan("commit:description")]: `fix:修复XXXbug`
    },
    {
      [chalk.cyan("注释")]: "新增特性/完成XXXX",
      [chalk.cyan("commit:description")]: `feat:新增特性XXXX`
    },
    {
      [chalk.cyan("注释")]: "改变构建流程",
      [chalk.cyan("commit:description")]: `chore:pull origin [分支名称]`
    },
    {
      [chalk.cyan("注释")]: "重构内容",
      [chalk.cyan("commit:description")]: `refactor:重构XXXX`
    },
    {
      [chalk.cyan("注释")]: "紧急修复",
      [chalk.cyan("commit:description")]: `hotfix:紧急修复XXXX`
    },
    {
      [chalk.cyan("注释")]: "回滚",
      [chalk.cyan("commit:description")]: `revert:回滚XXX版本`
    },
    {
      [chalk.cyan("注释")]: "更新文档",
      [chalk.cyan("commit:description")]: `update:更新文档`
    },
    {
      [chalk.cyan("注释")]: "打包项目",
      [chalk.cyan("commit:description")]: `build:打包XXXX`
    },
    {
      [chalk.cyan("注释")]: "测试文件",
      [chalk.cyan("commit:description")]: `test:测试XXXX`
    },
    {
      [chalk.cyan("注释")]: "暂存文件(保存进度)",
      [chalk.cyan("commit:description")]: `save:暂存XXXX`
    }
  ])
  console.log(
    chalk.red(
      `\ndescription:文字描述不得超过50个字符,推荐以动词开头:创建、修复、完成、修改、增加、更新等` +
      `\n\nSee https://shimo.im/docs/uJRXiSTYx2UhfVG5/  for more details.\n`
    )
  )
  process.exit(1)
}

接下来执行git指令检验钩子
在终端输入:

git commit -m "asdf"

最后看到结果:


image.png

小结

主要是利用git自带的commit-msg钩子监听自定义文件,实现commit校验。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容