• git commit 提交校验详解


    目录

    前言

    husky

    commitlint

    pre-commit 钩子

    安装 lint-staged

    存在问题


    前言

    本文主要探索 git commit 时代码提交校验的实现,日常开发我们使用 git 来管理代码,而 git commit 校验的实现依赖于第三方插件husky,commitlint,lint-staged等,他们各自都有特殊的功能,共同作用实现 git commit 提交校验。

    注:要实现 git commit 校验应确保你已经安装并配置好了相关的代码格式校验工具,比如eslint,prettier等。如果你还不知道如何安装 eslint,推荐阅读我的另一篇文章:

    ESLint入门 安装 使用 详解

    husky

    是什么

    husky 是一个 Git Hook 工具。其实就是一个为 git 客户端增加 hook 的工具。将其安装到所在仓库(husky install)的过程中它会自动在 .git 目录下增加相应的钩子实现在 pre-commit 阶段就执行一系列流程保证每一个 commit 的正确性。可以理解为 husky 是 git 版本管理工具为开发者开放的一个开口,让我们可以在代码提交的前后阶段做自己的事情。

    实现 git commit 提交校验其实是依赖于 githooks,即git 使用的挂钩(githooks )

    Git Hooks 就是那些在 Git 执行特定事件(如commit、merge,push、receive等等)前后后触发运行的脚本,挂钩是可以放置在挂钩目录中的程序,可在git执行的某些点触发动作。如果你使用过 vue,那么可以将挂钩类比为 vue 的生命周期钩子函数。挂钩可以在 git 的不同阶段做不同的事情。

    如果想了解 githooks 的相关内容,推荐你查看文章:

    GitHook工具 - husky 介绍及使用Husky 官方文档Husky - GitHub

    安装

    npm install husky --save-dev

    安装完成执行如下代码,初始化(生成) .husky 目录文件

    npx husky install

    .husky 文件用来存放需要被git 读取的钩子文件

    commitlint

    是什么

    commitlint 包含 @commitlint/cli 和 @commitlint/config-conventional 插件,

    commitlint 用来校验 commit 提交内容的格式的正确性

    安装

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

    安装完成添加 commit-msg 钩子,执行如下代码添加:

    npx husky add .husky/commit-msg

     将新增的 commit-msg 文件中的 undefined 替换为:

    npx --no-install commitlint --edit "$1"

    这个钩子的主要作用就是在执行 git commit 之前执行上面这条命令,判断 commit 提交信息格式的正确性,依赖于 commitlint.config.js 配置文件中配置的规则。

    在项目根目录新建 commitlint.config.js 文件,内容如下:

    1. module.exports = {
    2. // 继承的规则
    3. extends: ['@commitlint/config-conventional'],
    4. // 定义规则类型
    5. rules: {
    6. 'body-leading-blank': [2, 'always'],
    7. 'footer-leading-blank': [1, 'always'],
    8. 'header-max-length': [2, 'always', 108],
    9. 'subject-empty': [2, 'never'],
    10. 'type-empty': [2, 'never'],
    11. // type 类型定义,表示 git 提交的 type 必须在以下类型范围内
    12. 'type-enum': [
    13. 2,
    14. 'always',
    15. [
    16. 'feat', // 新功能 feature
    17. 'fix', // 修复 bug
    18. 'docs', // 文档注释
    19. 'style', // 代码格式(不影响代码运行的变动)
    20. 'refactor', // 重构(既不增加新功能,也不是修复bug)
    21. 'perf', // 性能优化
    22. 'test', // 增加测试
    23. 'chore', // 构建过程或辅助工具的变动
    24. 'revert', // 回退
    25. 'build' // 打包
    26. ]
    27. ],
    28. // subject 大小写不做校验
    29. 'subject-case': [0]
    30. }
    31. }

    现在你就可以按照配置的格式来提交你的代码了。

    推荐文章:Git Commit格式校验commitlint文档commitlint规则文档commitlint规则demo

    commit 时报错:

    Please add rules to your commitlint.config.js - Getting started guide: https://commitlint.

    那么现在当你 git commit 时必须严格安装规定的格式来提交你的 commit,但是如果代码有错误依然可以提交成功。所以下面就针对 git commit 时代码格式进行校验

    pre-commit 钩子

    创建命令

    npx husky add .husky/pre-commit

    因为代码正确性校验是依赖于其他插件的,比如我自己项目使用 eslint,而eslint 的命令行执行方式就是在 package.json 文件 script 对象中定义的命令,将 pre-commit 文件中的 undefined 替换为触发命令行执行的命令,如:npm run serve,serve即是你在 script 对象中配置的命令,如下:

    1. // package.json script对象
    2. "scripts": {
    3. "serve": "vue-cli-service serve",
    4. "build": "vue-cli-service build",
    5. "lint:eslint": "eslint --ext .js,.vue src --fix"
    6. },

    pre-commit 文件

    1. #!/usr/bin/env sh
    2. . "$(dirname -- "$0")/_/husky.sh"
    3. npm run lint:eslint

    现在当你每次提交代码都会对代码的正确性进行校验

    但是存在一个问题,就是每次修改一个文件就给所有文件执行一次 lint 检查,如果你觉得无所谓可以忽略下面的内容。

    如果你不想每次都对所有文件执行检查,那么可以使用 lint-staged 来实现这个功能

    安装 lint-staged

    安装

    npm install --save-dev lint-staged

    添加配置文件,在 .husky 文件中新增 lintstagedrc.js 文件,内容如下:

    1. module.exports = {
    2. '*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
    3. '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
    4. 'package.json': ['prettier --write'],
    5. '*.vue': ['eslint --fix', 'prettier --write'],
    6. '*.{scss,less,styl,html}': ['eslint --fix', 'prettier --write'],
    7. '*.md': ['prettier --write']
    8. }

    添加 lint-staged 的命令行执行方式,在package.json 文件 script 对象中添加:

    "lint:staged": "lint-staged -c ./.husky/lintstagedrc.js --allow-empty"

    -c 表示配置文件的路径

    --allow-empty 表示默认情况下,当 linter 任务撤消所有暂存更改时,lint-staged 将退出并出错并中止提交。使用此标志允许创建空的 git 提交。

    命令行配置及lint-staged 的详细内容请看:

    lint-staged 使用教程

    lint-staged - npm

    修改 pre-commit 钩子中的命令行,改为执行 lint-staged,如下:

    npm run lint:staged

    现在你可以正常提交代码了

    存在问题

    基于上述的提交方式可能会存在问题,具体问题及解决方案详见:

    vue 项目集成 husky+commitlint+stylelint

    完善后的 pre-commit 文件

    1. #!/bin/sh
    2. . "$(dirname "$0")/_/husky.sh"
    3. . "$(dirname "$0")/common.sh"
    4. [ -n "$CI" ] && exit 0
    5. # Check the file name
    6. # ! ls-lint cannot be used normally in mac pro of M1 system.
    7. # npm run lint:ls-lint
    8. # Format and submit code according to lintstagedrc.js configuration
    9. yarn run lint:lint-staged
    10. # npm run lint:prettier
  • 相关阅读:
    gitlab 搭建使用
    基于C++和QT实现的二进制数独游戏求解
    qsort:我很强,了解一下(详解过程)
    springboot基本使用十一(自定义全局异常处理器)
    Python生成allure测试报告,allure使用详细说明
    A,B=input().split(“,“)A=eval(A)A=str(A)B=eval(B)print(A*B)
    【马士兵】Python基础--13
    SSM 校园兼职平台
    pytorch基础学习(2)
    能学习139条红外码的红外空调控制器长什么样子?
  • 原文地址:https://blog.csdn.net/lwx931449660/article/details/126407895