前端工程化--commit代码校验配置

2023-05-16

需求

配置使得在git commit -m 'xxxx’时,先执行1. eslint检测 2.commit规范检测,两个条件通过后才commit成功,才可以push代码。是前端工程化的一部分,使得代码及commit更加规范

commitlint

commitlint: 可以帮助我们 lint commit messages, 如果提交的不符合指向的规范, 拒绝提交
需要一份校验的配置, 这里推荐 @commitlint/config-conventional (符合 Angular团队规范).
安装:

npm install  @commitlint/config-conventional @commitlint/cli --save

同时需要在项目目录下创建配置文件 .commitlintrc.js, 写入:

module.exports={extends:['@commitlint/config-conventional'],rules:{}};

rules可以自己设置团队规范,我没设,用的angular团队规范

husky

commitlint配置完成后还要配置husky。husky是git的hook(钩子)工具

【git钩子】
就像vue的生命周期钩子函数,Git 能在特定的重要动作发生时触发自定义脚本。有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
【提交钩子有】:(后面会有详细解释)
pre-commit
prepare-commit-msg
commit-msg
post-commit

前端则可以用插件husky来使钩子生效。
安装

npm install husky --save

配置
在package.json中配置

  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS"
    }
  }

这段配置的意思是:在’commit-msg’这个钩子内获取commit里的内容进行commitlint检测,如果果该钩子脚本以非零值退出,Git 将放弃提交
此时我如果提交不符合规范的commit,结果如下

$ git commit -m "测试 commitlint"
husky > commit-msg (node v10.13.0)

⧗   input: 
测试 commitlint

✖   message may not be empty [subject-empty]
✖   type may not be empty [type-empty]
✖   found 2 problems, 0 warningshusky > commit-msg hook failed (add --no-verify to bypass)

可以看到如果不按照规范书写commit的日志会提示报错

下面输入正确的commit 日志信息:注意冒号后面要留空格,下面有介绍具体的编辑规范信息

$ git commit -m "feat(): 添加commitlint"
husky > commit-msg (node v10.13.0)

⧗   input: feat(): 添加commitlint
✔   found 0 problems, 0 warnings[master 7a5bc00] feat(): 添加commitlint
 4097 files changed, 219349 insertions(+)
 create mode 100644 commitlint.config.js
 create mode 120000 node_modules/.bin/JSONStream
 create mode 120000 node_modules/.bin/commitlint
 create mode 120000 node_modules/.bin/conventional-commits-parser

下面就可以push了

新需求

按理来说这样已经成功了,但希望commitlint检测失败后有提示后再退出。比如如下效果
在这里插入图片描述
那就需要对husky的配置进行修改,修改涉及到shell脚本知识

  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS || (node scripts/pre-commit.js&&exit 8)"
    }
  }

对于shell1||shell2,只有在shell1执行失败时,shell2才会执行,否则shell2是不执行的
所以以上配置的意思是commitlint -e $GIT_PARAMS失败时,执行
(node scripts/pre-commit.js&&exit 8)
即执行package.json所在文件夹下的scripts/pre-commit.js文件后退出
详细shell见shell中&&和||的使用方法
项目目录如下
在这里插入图片描述
pre-commit.js文件内容如下,要npm install chalk --save,引入chalk模块,作用是为了让console出来的有颜色。。。

const chalk = require('chalk');
console.log(
  chalk.red(`commit格式错误,正确示例:git commit -m 'fix: 修复bug'`),
  chalk.green(` 
  type (只允许下列7个标识):
  feat:新功能(feature)
  fix:修补bug
  docs:文档(documentation)
  style: 格式(不影响代码运行的变动)
  refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  test:增加测试
  chore:构建过程或辅助工具的变动
  `)
)

这样就配置完成了,可以达到效果了

加上eslint

完成后,又希望提交的代码都符合eslint规范,如果不符合规范不能提交,所以在pre-commit钩子里加上eslint检查,配置如下,执行npm run lint

  "husky": {
    "hooks": {
      "pre-commit": "npm run lint",
      "commit-msg": "commitlint -e $GIT_PARAMS || (node scripts/pre-commit.js && exit 8)"
    }
  }

这样就配置完了
eslint检测不通过提交不了,要想解决eslint错误可以看解决eslint报错

git钩子详解

刚才用到了pre-commit, commit-msg,解释如下,有点像vue的生命周期钩子函数,在提交前依次执行,我这里把eslint检查放在pre-commit里,commitlint检查放commit-msg里
具体:自定义 Git - Git 钩子
pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你可以用 git commit --no-verify 来绕过这个环节。 你可以利用该钩子,来检查代码风格是否一致(运行类似 lint 的程序)、尾随空白字符是否存在(自带的钩子就是这么做的),或新方法的文档是否适当。

prepare-commit-msg 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。 它允许你编辑提交者所看到的默认信息。 该钩子接收一些选项:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA-1 校验。 它对一般的提交来说并没有什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提交、压缩提交和修订提交等非常实用。 你可以结合提交模板来使用它,动态地插入信息。

commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径。 如果该钩子脚本以非零值退出,Git 将放弃提交,因此,可以用来在提交通过前验证项目状态或提交信息。 在本章的最后一节,我们将展示如何使用该钩子来核对提交信息是否遵循指定的模板。

post-commit 钩子在整个提交过程完成后运行。 它不接收任何参数,但你可以很容易地通过运行 git log -1 HEAD 来获得最后一次的提交信息。 该钩子一般用于通知之类的事情。

commit message规范

那么什么样的是符合规范的commit message?
一般就是
type(scope): subject
例子:
fix: 修复bug

type:种类,必写
scope:影响范围 可以不写
subject:简短说明,50字符内
其实还有body,foot什么的,我觉得写个subject简短说明就够了,难不成还在commit里写作文
注意:冒号后面一定要加空格,否则不能通过commitlint验证

type有以下几种:

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端工程化--commit代码校验配置 的相关文章

  • 使用KSP处理注解和生成Kotlin代码

    前言 ksp是Kotlin 符号处理工具 类似于kapt apt 可用于开发轻量级编译器插件 github地址 google ksp Kotlin Symbol Processing API github com 也可以理解为注解处理和编译
  • 使用MavenCentral发布Kotlin多平台库的远程依赖(KMM,KMP)

    前言 开发者可能都会做自己的开源库 像我以前只做一些单平台的 如Android或JVM平台 这时候直接使用jitpack即可 很简单就能发布远程依赖 jitpack参考 发布开源库的踩坑经历 jitpack io 李小白lt的博客 而现在K
  • 解决Kotlin/Native报错:There is still an unbound symbol after generation of IR module <xxx>:

    报错信息 There is still an unbound symbol after generation of IR module lt xxx gt Unbound public symbol IrSimpleFunctionPubl
  • mysql数据库自动备份

    前言 服务器中数据库的数据是最重要的东西 如果因为某些情况导致数据库数据错误 数据错乱或数据库崩溃 这时一定要及时的修复 但如果数据丢失或数据没法用了 这时就要回滚数据了 而这时就需要我们经常的备份数据库的数据 正文 一般别人都会推荐使用N
  • 坑爹的微信支付(签名错误)

    前言 以前调微信支付 直接把demo粘过来改改 或者从老项目粘过来 这次接手一个一年之前的项目 说微信支付没调通 好吧 我就调吧 正文 1 之前的body写的是中文 改成英文 结果 失败 不过这一步很必要 2 传递的xml编码换为UTF 8
  • androidx使用FileProvider适配安卓7

    前言 安卓7版本后 需要适配获取本地uri 否则会报错 之前用的android support库 可以参考这篇文章 lt 点击查看 gt 但是现在使用了androidx后 发现清单文件中配置不一样了 适配方法 以前是 lt provider
  • Kotlin优雅的使用sp(SharedPreferences)

    前言 我平时用java写的sp工具类 现在有两个需求 第一个是要管理sp的文件名 虽然java可以通过Config的方式配置几个final静态的字符串常量来管理 但是总感觉不够优雅 而且可能存在随便写个文件名 不放在Config内的情况 第
  • binascii.Error: Incorrect padding 报错解决

    输入的base64编码字符串必须符合base64的padding规则 当原数据长度不是3的整数倍时 如果最后剩下两个输入数据 xff0c 在编码结果后加1个 61 xff1b 如果最后剩下一个输入数据 xff0c 编码结果后加2个 61 x
  • Java类成分和四大属性

    Java类定义和四大属性 Java类成分面向对象思想概述类的五大成分类的构造器封装this关键字static关键字成员变量的分类和访问 继承 extends Java类成分 面向对象思想概述 Java是一种面向对象的高级编程语言 面向对象
  • python绘制激活函数曲线图及其导数曲线图,激活函数包括sigmoid、relu、tanh

    因写大论文需要 xff0c 在知网上别人的论文中扣下来清晰度不够 xff0c 其他网页上截屏下来可能包含水印 xff0c 同时也比较难找全 因此参考CSDN博客资料 xff0c 自己画出来用于论文书写 span class token ke
  • cv2.error: color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor‘

    该文章主要解决使用coco格式数据报错 xff01 将标注完成的数据集通过xml2coco xff08 转换代码 xff09 后生成coco数据集格式 运行train py xff0c 出现标题的报错 xff0c 出现该错误的原因和解决办法
  • 在安装之后使用labelme出现qtpy.PythonQtError:No Qt bindings could be found错误

    我在base环境 xff08 python3 7 可成功安装和使用labelme xff0c 而在同py37版本和py36的虚拟环境中可安装labelme包 xff0c 但在使用的时候出现报错 xff0c 如下 xff1a 我尝试着去解决第
  • 解决RuntimeError: implement_array_function method already has a docstring报错问题

    该问题的报错最后一行显示为 xff1a RuntimeError implement array function method already has a docstring 在其错误上面所提示的信息可得知 xff0c pandas nu
  • 最小二乘圆拟合模型公式推导&MATLAB代码求圆拟合

    理论部分1 xff1a https wenku baidu com view ecda32525beef8c75fbfc77da26925c52dc59156 html 最小二乘圆拟合模型公式推导 理论部分2 xff1a https blo
  • 在windows11安装VMware & ubuntu

    在win11安装虚拟机 xff08 win11 43 VMware16 43 ubuntu18 04 xff09 xff0c 遇到的一些情况进行记录 xff1a 1 安装VMware 下载 VMware Workstation Pro 2
  • MATLAB diag & spdiags函数的使用

    diag amp spdiags函数的使用 xff1a 下面对diag 函数和spdiags函数进行了实例演示 xff0c 特别注意的是spdiags函数 xff1a 1 Bout d 61 spdiags A 矩阵A mn xff0c 当
  • diskpart命令创建GPT磁盘分区

    利用diskpart命令创建GPT磁盘分区图文教程很多朋友都是使用工具软件完成创建GPT磁盘分区 xff0c 实际上你无论你是使用光盘 U盘还是硬盘 NT6 等方式全新安装Win7或者Win8系统 xff0c 都可以利用diskpart命令
  • slf4j使用xml配置日志不能显示的问题

    在我使用slf4j的xml配置方式的时候 一直加载不出xml的配置文件 导致里面的设置不能被读取 控制台一直打印不去日志信息 正在寻找解决办法 报的错误是 log4j WARN Please initialize the log4j sys
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • Navicat如何连接远程服务器的MySQL

    前言 xff1a 运行环境及工具 Navicat for Mysql 腾讯云轻量级服务器一台 xff08 Centos 7 xff09 Mysql 8 0 24 xff08 远程服务器内安装的 xff09 Xshell7 xff08 连接操

随机推荐

  • 警告!你的隐私正在被上亿网友围观偷看!

    你的隐私正在被上亿万网友围观偷看 xff01 事情要从一款被推荐到烂的软件说起 Everything 这个软件想必很多同学都有听过 xff0c 是一款非常好用的文件搜索软件 xff0c 很多同学把它设置为开机必启动项之一 简单来说 Ever
  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程 jdk的下载和安装 xff1a 1 打开浏览器 xff0c 输入jdk的官网地址 xff1a https www oracle com java technologies javase downloads htm
  • 面试官:如何让主线程等待所有的子线程执行结束之后再执行?我懵了

    使用Thread的join方法 package com qcy testThreadFinish 64 author qcy 64 create 2020 09 09 17 05 23 public class Case1 public s
  • 【亲测可用】 Mac/Linux 安装中文版 man 帮助命令

    Mac Linux 安装中文版 man 帮助命令 其中的需要下载的两个 安装包我上传到 csdn 了 xff0c 网络不好的可以直接 获取 不需要用 wget 下在 xff0c 虽然 wget 是很稳定 xff0c 但是国内的网络 还是太菜
  • 安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

    安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法 介绍 网络上流传的状态栏导航栏沉浸的方式有很多 xff0c 但是在我使用的时候都失效了 xff0c 在官网也没找到合适的例子达到期望 xff0c 根据情况判断是由于目前版本
  • Python 循环结构

    在python中 xff0c 循环结构有for循环和while循环两种 1 while循环 while循环结构格式 xff1a while 条件表达式 xff1a 条件执行体 当条件表达式判断为真时 xff0c 就执行条件执行体中的内容 如
  • windows terminal + oh-my-posh 2022 [保姆级]配置教程

    windows terminal 43 oh my posh 2022 版配置教程 目录 windows terminal 43 oh my posh 2022 版配置教程 总览 1 下载powershell 2 安装字体 下载并安装字体至
  • DataBinding的基本使用(五)

    DataBinding的基本使用 五 DataBinding基本使用包括以下内容 xff1a 单纯的摆脱findviewbyid 绑定基本数据类型及String 绑定Model数据 绑定事件 通过静态方法转换数据类型 通过运算符操作数据 自
  • idea快捷键大全

    实用快捷键 Ctrl 43 或 Ctrl 43 Shift 43 注释 xff08 或者 xff09 Ctrl 43 D 复制行 Ctrl 43 X 删除行 快速修复 alt 43 enter modify cast 代码提示 alt 43
  • 自定义组件实现v-model

    在项目中需要做一个标题展开框 xff0c 点击展开才会显示下面的内容 因为多个地方都需要这样的可展开标题 xff0c 所以做了一个自定义组件 组件需要一个双向绑定的值 xff0c 控制展开 缩放 于是就思考 xff0c 父向子可以用prop
  • linux下提示bash:command not found

    如果新装的系统 xff0c 运行一些很正常的诸如 xff1a shutdown xff0c fdisk的命令时 xff0c 悍然提示 xff1a bash command not found 那么 首先就要考虑root 的 PATH里是否已
  • k8s与pod概念

    此文章为学习过程中根据网上资源整合总结 文章目录 1 为什么需要k8s1 1 应用部署模式的演进1 11 模式对比1 12 各模块介绍 1 2 管理大量的容器 k8s 2 ks8的集群架构3 pod k8s调度的最小单元3 1 一个 pod
  • git在http协议切换账号/输错账号密码如何更改

    掩面哭泣 xff0c 为什么提交总会出问题 这次是因为我push到gerrit上的时候第一次用错成了自己的账号 xff0c 然后想更改成公司的 xff0c 不再跳出登录界面了 xff0c 改不了 因为只有公司账号上设置了agreement
  • 【vue】利用prettier插件规避烦人的eslint报错和代码不规范

    本文主要包括两点 xff1a 大家协同开发代码各异 xff0c eslint加上 64 vue prettier采取recommended 43 prettier组合可使得代码更规范使用vscode的prettier插件在修改保存时自动格式
  • 前端理解base64

    一 背景 xff1a ascii码 字符 61 gt 二进制 计算机中所有数据的存储都是以二进制模式 xff0c 比如想要存储abcd需将其转化为二进制 xff0c 具体用哪些二进制来表示哪个符号 xff0c 有一个统一的编码规则 xff0
  • antd使用相关笔记

    文章目录 modal设置样式无效checkboxform设置值 modal设置样式无效 因为挂在div外 xff0c 所以用less时包在该组件的根div下的css样式设置无效 xff0c 需设置 xff1a span class toke
  • vue实例的生命周期详解

    Vue实例的生命周期 简介 此篇文章说的是最简单的单个VUE组件的生命周期 官网中的长图诠释了Vue实例从创建 xff0c 运行到销毁的整个过程 从vue实例的创建 xff0c 运行 xff0c 销毁期间 xff0c 总是伴随着各种各样的事
  • vue实例和组件的区别

    引言 上次写vue单组件项和路由的时候 xff0c 想到一个问题 new Vue 是一个Vue实例 xff0c 那么组件是Vue实例吗 xff1f 分析 之前说了 xff0c 有两种开发方式 一个是基于浏览器的 xff08 即直接在scri
  • 全面分析ajax跨域访问原因及解决方案

    文章目录 引言什么是ajax跨域问题为什么会发生ajax跨域访问解决思路方法一 xff1a 浏览器禁止检查方法二 xff1a jsonp解决 jsonp是什么 用jsonp后台需要改动 jsonp原理 jsonp有什么弊端 方法三 xff1
  • 前端工程化--commit代码校验配置

    需求 配置使得在git commit m 39 xxxx 时 xff0c 先执行1 eslint检测 2 commit规范检测 xff0c 两个条件通过后才commit成功 xff0c 才可以push代码 是前端工程化的一部分 xff0c