Git Hooks

发布时间 2023-09-08 20:29:24作者: 不停奔跑的蜗牛

Git Hooks定义

Git Hooks是Git的一个重要特性,它让你可以在Git仓库中定义一些自动化的脚本,这些脚本可以在特定的Git事件(如提交代码、接收代码等)发生时被触发执行。它们是在Git仓库目录中的 .git/hooks/ 下的一组可执行文件。

具体来说,每个Git仓库中都有一个名为".git/hooks"的隐藏目录,该目录中存放了一些示例的hook脚本。这些脚本本质上就是可执行的程序,可以用任何你喜欢的脚本语言来编写(如Bash、Python、Node.js等),只要该语言在你的系统环境中可执行即可。

例如,当你提交commit时,Git会检查 .git/hooks/ 中是否存在一个名为 pre-commit 的脚本。如果存在,并且这个脚本是可执行的,那么Git就会在执行commit操作之前运行这个脚本

Git Hooks的作用和用途

Git Hooks的作用非常广泛,它可以用来自动化和自定义你的Git工作流程。

以下是Git Hooks的常见应用

  • 代码风格检查:可以在 pre-commit Hook中运行一个lint工具对代码进行格式检查,确保提交的代码符合代码规范。
  • 自动化测试:可以在 pre-push Hook中自动运行测试用例,如果测试失败,那么Git就不会执行push操作,确保代码的质量。
  • 邮件通知:可以在 post-commit 或 post-receive Hook中发送一个邮件通知,告知其他开发者你已经提交了新的更改。
  • 自动生成文档:可以在 post-merge Hook中运行一个脚本,自动从最新的源代码生成API文档。

第三方管理库

一、pre-commit

要在JavaScript项目中使用pre-commit库,你需要遵循以下步骤:

  1. 安装pre-commit库:可以使用npm(或yarn)进行安装:
    npm install pre-commit --save-dev

     

  2. . 在你的package.json文件中添加pre-commit字段,然后在里面列出你希望在提交前运行的npm脚本:

    "pre-commit": [
        "lint",
        "test"
    ]
在这个例子中,linttest都是在package.json文件中定义的npm脚本。
"scripts": {
    "lint": "eslint .",
    "test": "jest"
}

现在每当你尝试提交代码时,pre-commit都会首先运行linttest这两个脚本。如果任何一个脚本失败了(返回非零退出代码),提交就会被阻止。

这种方法可以保证在代码提交到仓库之前都已经过了lint检查和单元测试。

二、husky

husky Git 钩子(hooks)是一种强大的工具,可以在你执行某些特定的 git 操作时自动执行一些任务。例如,你可以在每次提交代码时自动运行代码格式化器,或者在推送代码之前自动运行测试套件。以下是如何使用 git 钩子来改进你的工作流程的一些例子:

       1. commitlint:提交代码是commit的规范 https://github.com/conventional-changelog/commitlint 安装步骤

# Install commitlint cli and conventional config
npm install --save-dev @commitlint/{config-conventional,cli}
# For Windows:
npm install --save-dev @commitlint/config-conventional @commitlint/cli

# Configure commitlint to use conventional config
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
# Install Husky v6
npm install husky --save-dev
# or
yarn add husky --dev

# Activate hooks
npx husky install
# or
yarn husky install

Add hook

npx husky add .husky/commit-msg  'npx --no -- commitlint --edit ${1}'


2.自动格式化代码
:使用lint-stagedhusky库自动格式化代码。

下面是具体步骤:

首先,你需要在项目中安装这两个库:ESlint和prettier

npm install --save-dev lint-staged husky
然后,需要在package.json文件中配置huskylint-staged。你可以使用Prettier和ESLint作为代码格式化工具。假设已经安装了Prettier和ESLint,配置如下:
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.js": ["prettier --write", "eslint --fix", "git add"]
  }
}

这个配置中,husky设置了一个在提交前运行的钩子。这个钩子会运行lint-staged
lint-staged会对所有 staged 的JavaScript文件进行处理。处理步骤包括运行prettier来自动格式化代码,运行eslint来自动修复可能的问题,然后再次添加到git中(git add)。

最后,需要在.eslintrc文件中(或者你的ESLint配置文件)添加以下规则,让ESLint和Prettier能够很好地协同工作:

{
  "rules": {
    "prettier/prettier": "error"
  },
  "plugins": ["prettier"],
  "extends": ["plugin:prettier/recommended"]
}

现在,每次提交代码时,所有的JavaScript文件都会被自动格式化,同时还会修复所有的ESLint可以自动修复的问题。如果有任何错误无法被自动修复,提交会被阻止,你需要手动修复这些错误。

 

3.自动运行测试:如果你有一个自动化的测试套件,你可以在每次提交或推送代码时自动运行它。这可以确保你不会意外地破坏任何东西。

  1. "husky": {
      "hooks": {
        "pre-push": "npm test"
      }
    }
    这会在每次推送之前运行你的测试套件。
  1. 自动检查代码质量:你可以使用像 ESLint 这样的工具来检查你的代码质量,并在你提交代码时自动运行它。
    "husky": {
      "hooks": {
        "pre-commit": "eslint ."
      }
    }
    这会在每次提交前运行 ESLint。

通过这些方式,git 钩子可以帮助你打造一个更精致、自动化的工作流程,它可以确保你的代码质量,并帮助你避免错误。 当然,除了上述的一些基本用法,Git 钩子还有许多其他的使用场景,例如:

4.自动更新版本号:使用 npm version 或者类似的工具,可以在每次提交或推送代码时自动更新版本号。例如,以下的钩子在每次提交时自动更新版本号

  1. "husky": {
      "hooks": {
        "pre-commit": "npm version patch"
      }
    }

 5.自动部署:如果你有一个自动化的部署系统,可以设置一个钩子,在每次推送代码到部署分支时,自动触发部署过程。例如,以下的钩子在每次推送到 master 分支时,自动运行部署脚本:

"husky": {
  "hooks": {
    "pre-push": "npm run deploy"
  }
}

 

6.  自动更新文档:如果项目有自动生成文档的工具,例如 JSDoc,你可以在每次提交或推送代码时自动更新文档。例如,以下的钩子在每次提交时自动更新 JSDoc 文档:

"husky": {
  "hooks": {
    "pre-commit": "jsdoc -c jsdoc.json"
  }
}

 

7.  自动某些脚本 custom.js:例如你可以设置一个钩子,在每次提交或推送代码时自动运行某些脚本,比如代码分析等。例如,以下的钩子在每次提交时自动运行 custom.js:

"husky": {
  "hooks": {
    "pre-commit": "node custom.js"
  }
}

以上就是一些 Git 钩子的使用场景,这些都可以帮助你打造一个更精致、自动化的工作流程。然而,需要注意的是,虽然 Git 钩子有很多用途,但是它们并不能替代一个完整的 CI/CD 系统,因为 Git 钩子只在本地运行,而 CI/CD 系统可以在服务器上运行,从而提供更全面的自动化解决方案。