git hook

235 阅读3分钟

一、git hook

hook在计算机领域有两种理解:
一种是消息的拦截处理,在消息到达之前提前对消息进行处理;
一种就是常见的事件触发后执行的一段程序

1.1 git hook是什么?

git hook就是在执行某个git命令的时候,自动触发某些程序。
git hook主要分为两类:
1.客户端hook(3个)
(1)pre-commit:我们在提交之前执行静态代码检查 我们一般借助pre-commit这个hook,来实现代码在提交到本地仓库之前,对提交内容的遍历和检测。一般会配合eslintstyle-lint进行代码静态检测。
(2)commit-msg:commit本身的消息格式
(3)pre-push:触发单元测试
客户端的hook主要针对两个事件,其中commit有两个hook,一个是pre-commit和commit-msg,其中pre-commit和commit-msg这两个钩子是在执行git commit -m'feature(dashboard): dashboard'触发。
pre-commit是在commit操作之前触发,一般在此钩子中对代码的格式进行静态检查。
commit-msg钩子一般是用来对commit提交的信息和格式进行认证。 image.png image.png 这里的hosky属性是配置git hooks的,上面图中配置了两个hook钩子,其中pre-commit的值为“lint-staged”,lint-staged是一个工具(这个是一个控制lint检查范围的工具,因为假如我们默认项目中已存在的代码都是进过lint检查过的,那么我们就可以认为本次提交的代码,只需要对暂存区的代码进行lint检查,而不用进行遍历检查,这将大大缩短lint检查的时间,因此这就需要lint-staged),lint-stage专门对暂存区的代码进行格式化的。

1.  // 安装husky
    npm install husky --save-dev
2.  // 安装lint-staged,只对修改的文件进行check
    // npm install lint-staged --save-dev`]

"husky": { // husky:一个git钩子工具,这里主要用pre-commit钩子。通俗点讲就是husky可以在你commit之前帮你做一些事情。
    "hooks": { // 即gitHooks,定义在Git 提交之前,执行哪些钩子
      "pre-commit": "lint-staged", // git commit时触发pre-commit钩子,运行lint-staged命令,然后在下面的lint-staged属性中配置具体对哪些文件做哪些对应的代码检查
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
      // 当我们在当前项目中执行 git commit -m '测试提交' 时将触发commit-msg事件钩子并通知husky
      // 从而执行 commitlint -E HUSKY_GIT_PARAMS命令,也就是我们刚开始安装的./node_modules/.bin/commitlint,它将读取commitlint.config.js配置文件(如下图所示)中的规则并对我们刚刚提交的测试提交这串文字进行校验
      // 若校验不通过,则在终端输出错误,commit终止。
    }
  },
  "lint-staged": { // 上面在husky的hooks中配置了钩子,即commit时触发pre-commit钩子运行lint-staged命令
    "src/**/*.{js,ts,vue}": "eslint",
    "src/**/*.{css,less,vue}": "stylelint"
  }

image.png commitlint.config.js文件

module.exports = {
    extends: ['@commitlint/config-conventional'],
    rules: {
        'type-enum': [
            2,
            'always',
            [
                'build',
                'chore',
                'ci',
                'docs',
                'feature',
                'hotfix',
                'bugfix',
                'perf',
                'refactor',
                'revert',
                'style',
                'test'
            ]
        ]
    }
};

2.服务端hook

  • pre-receive 在服务端接受到推送时且在推送过程完成前被触发
  • post-receive 在服务端接收到推送且推送完成后被触发

1.2 git hook的工程使用和shell编写

在commit和push触发时候使用,一般来说会下载husky第三方插件,

1.3 git hook在commit和CI/CD中的使用

参考文献:cloud.tencent.com/developer/a…