在日常使用Git执行commit、push等命令时,Git版本库会记录下这些数据的变动,并一直保存。为了保证代码的安全性和提高代码质量,有时我们希望在用户执行commit、push等操作之前进行一些检查,这时就需要用到Git钩子。
pre-commit 是一个开源的钩子框架,目前Star 数1.1万,仓库地址 https://github.com/pre-commit/pre-commit
,它可以帮助开发人员在 Git 提交代码之前运行一系列的代码检查和格式化操作,例如代码代码风格和规范检查。它可以帮助团队在提交代码之前自动执行各种检查,以确保代码质量和一致性。 pre-commit 工具的主要特点包括:
-
易于配置:pre-commit 使用 .pre-commit-config.yaml 文件作为配置文件,你可以在其中指定要运行的各种钩子和命令。该文件可以存储在项目的根目录中,也可以存储在用户的主目录中,以供全局使用。 -
多语言支持:pre-commit 支持多种编程语言和工具。它可以与各种格式化工具、静态代码分析器、代码风格检查器等集成。 -
可扩展性:pre-commit 允许自定义和添加自己的钩子脚本。可以编写自己的脚本来运行特定的代码检查或格式化操作。 -
自动化: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文件内容
2.4 自动运行
执行git commit命令将会自动检测是否符合相关规范,如下由于提交的内容有大文件,commit 失败
三、创建新钩子
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