Pre-commit: Git hooks管理工具

在日常使用Git执行commit、push等命令时,Git版本库会记录下这些数据的变动,并一直保存。为了保证代码的安全性和提高代码质量,有时我们希望在用户执行commit、push等操作之前进行一些检查,这时就需要用到Git钩子。

pre-commit 是一个开源的钩子框架,目前Star 数1.1万,仓库地址 https://github.com/pre-commit/pre-commit,它可以帮助开发人员在 Git 提交代码之前运行一系列的代码检查和格式化操作,例如代码代码风格和规范检查。它可以帮助团队在提交代码之前自动执行各种检查,以确保代码质量和一致性。 pre-commit 工具的主要特点包括:

  1. 易于配置:pre-commit 使用 .pre-commit-config.yaml 文件作为配置文件,你可以在其中指定要运行的各种钩子和命令。该文件可以存储在项目的根目录中,也可以存储在用户的主目录中,以供全局使用。
  2. 多语言支持:pre-commit 支持多种编程语言和工具。它可以与各种格式化工具、静态代码分析器、代码风格检查器等集成。
  3. 可扩展性:pre-commit 允许自定义和添加自己的钩子脚本。可以编写自己的脚本来运行特定的代码检查或格式化操作。
  4. 自动化:pre-commit 可以在每次提交代码之前自动运行。

一、安装pre-commit

1.1 pip安装

Pip 是Python的包管理器,安装pip的前提是需要本地拥有Python环境

pip install pre-commit

1.2 MacOs安装

brew install pre-commit

1.3 Conda 安装

conda install -c conda-forge pre-commit

二、快速入门

2.1 创建名为.pre-commit-config.yaml文件

可以使用pre-commit sample-config  命令,该命令会输出一个基本的配置文件,内容如下

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

具体含义如下:

  • repos:定义了一系列仓库的映射。
  • repo:定义了接下来使用的 hooks 脚本从哪个仓库进行拉取
  • rev:指定了拉取的tag数据
  • hooks:定义了要使用的钩子列表。

在这个例子中,配置了四个钩子:

  • trailing-whitespace:用于检查并修复代码中的行尾空白字符。
  • end-of-file-fixer:用于检查并修复文件末尾的行尾符。
  • check-yaml:用于检查 YAML 文件的语法是否正确。
  • check-added-large-files:用于检查提交的文件是否过大(默认检测阈值为 500KB)

2.2 手动运行

钩子添加完毕之后,默认情况下,pre-commit 只会检测当次变更了的文件,因此一般建议在添加之后,运行一次针对项目的全面检测。

admin@admindeMacBook-Pro LearnGit %  pre-commit run --all-files
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed

2.3 安装Git Hook

上边是检测项目是否合规是手动检测运行,真实的项目中肯定不能每次都手动检测,此时还应该运行一下安装命令,把 pre-commit 的配置文件加载到 git hooks 当中,这样每次git commit 时,会自动进行检测

admin@admindeMacBook-Pro LearnGit %pre-commit install
pre-commit installed at .git/hooks/pre-commit

PS:如果本地电脑中之前设置过全局hookPath路径,直接安装会报如下错误

admin@admindeMacBook-Pro LearnGit % pre-commit install
[ERROR] Cowardly refusing to install hooks with `core.hooksPath` set.
hint: `git config --unset-all core.hooksPath`

需要先清除全局配置中的core.hooksPath 设置

git config --global --unset-all core.hooksPath

安装完成后查看pre-commit文件内容Pre-commit: Git hooks管理工具

2.4 自动运行

执行git commit命令将会自动检测是否符合相关规范,如下由于提交的内容有大文件,commit 失败Pre-commit: Git hooks管理工具

三、创建新钩子

pre-commit支持多种语言编写的钩子,只要git仓库是可安装的包(gem、npm、pypi 等)或公开可执行文件,都可以与pre-commit一起使用。 一个包含 pre-commit 插件的 Git 仓库必须包含一个 .pre-commit-hooks.yaml 文件

- id: trailing-whitespace
    name: Trim Trailing Whitespace
    description: This hook trims trailing whitespace.
    entry: trailing-whitespace-fixer
    language: python
    types: [text]

该文件的意思

  • id: trailing-whitespace:插件的唯一标识符。在该文件中,每个插件都需要一个唯一的 ID 来进行识别。
  • name: Trim Trailing Whitespace:插件的名称,用于描述插件的作用。
  • description: This hook trims trailing whitespace.:对插件的描述,说明该插件的功能是去除末尾的空白字符。
  • entry: trailing-whitespace-fixer:插件的入口点。这指定了插件的实际执行逻辑所在的文件或命令。
  • language: python:插件的编程语言。这表示该插件使用 Python 编写。
  • types: [text]:针对文件类型的过滤器。这个示例中,该插件只会在文本文件上运行,其他类型的文件将被忽略。

通过这个配置,pre-commit 工具将运行名为 “Trim Trailing Whitespace” 的插件,并使用指定的 Python 文件 trailing-whitespace-fixer 来执行去除末尾空白字符的操作。该插件仅对文本文件生效。

四、高级功能

4.1 卸载

pre-commit uninstall

4.2 暂时禁用某个钩子

通过设置 SKIP 环境变量,如下命令,跳过flake8检测

SKIP=flake8 git commit -m "foo"

4.3 限制钩子执行阶段

Pre-commit 支持多种不同类型的git hook,默认是在commit阶段检测,但是也支持诸如pre-push、pre-merge-commit、commit-msg等等阶段检测 如下命令所示可以通过指定–hook-type 来确定执行阶段

admin@admindeMacBook-Pro LearnGit % pre-commit install --hook-type pre-commit --hook-type pre-push
pre-commit installed at .git/hooks/pre-commit
pre-commit installed at .git/hooks/pre-push

支持的Git hook如下

  • commit-msg
  • Post-checkout
  • Post-commit
  • Post-merge
  • Post-rewrite
  • Pre-commit
  • Pre-merge-commit
  • Pre-push
  • Pre-rebase
  • prepare-commit-msg


原文始发于微信公众号(洋洋自语):Pre-commit: Git hooks管理工具

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/273061.html

(0)
明月予我的头像明月予我bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!