git pre-commit使用
# Git hook
Git能在特定的重要动作发生时触发自定义脚本钩子。钩子分为两组:
客户端钩子:pre-commit, prepare-commit-msg, commit-msg, post-commit等,主要在服务端接收提交对象时、推送到服务器之前调用。
服务器钩子:pre-receive, post-receive, update等,主要在服务端接收提交对象时、推送到服务器之前调用。 git hooks位置位于每个git项目下的.git/hooks目录里,进去后会看到这些钩子的官方示例,都是以.sample结尾的文件,这些示例脚本是不会执行的,去掉.sample后缀可激活该钩子脚本。
# pre-commit说明
pre-commit预提交,是git hooks中的一个钩子,由git commit命令调用,可以通过--no-verify参数绕过调用pre-commit。通常用于在提交代码前,进行代码规范检查。
但是如果直接通过编写git hooks脚本来实现代码规范检查,会有如下的一些问题:
规范越多,编写的脚本越复杂 本地的规范修改,没法方便的同步到项目中其他开发人员 不同语言,代码规范不一样,脚本设置都不同 那为了更方便的管理pre-commit的设置,于是有了一个同名的工具项目pre-commit,一个用于管理和维护多语言预提交挂钩的框架。官网地址:https://pre-commit.com/
# 安装
pip install pre-commit
1
# 设置
设置配置文件 pre-commit依赖项目根目录配置文件.pre-commit-config.yaml。需要手动在根目录创建此文件。
# 在根目录执行如下命令,生成一个默认的配置,python版本
pre-commit sample-config > .pre-commit-config.yaml
1
2
2
# yaml配置文件说明
.pre-commit-config.yaml配置详细说明
首先,是顶层的全局配置,配置项有如下这些:
repos | (必需)存储库映射列表 |
---|---|
default_language_version | (可选)从语言到应该用于该语言的默认language_version的映射。这将只覆盖没有设置language_version的单个钩子。默认为:{} |
default_stages | (可选)钩子的stages属性的配置范围默认值。这将只覆盖没有设置stages的单个钩子。默认值:all stages |
Files | (可选)全局文件包含,正则匹配模版,1.21.0新配置,默认值:"" |
exclude | (可选)全局文件排除,正则匹配模版,1.1.0版本新配置,默认值:^$ |
fail_fast | (可选)设置为true时,预提交将在第一次失败后停止运行钩子。1.1.0版本新配置 |
minimum_pre_commit_version | (可选)需要pre-commit的最小版本。1.15.0版本新配置 |
# 举例
# 设置默认的阶段为commit,只在提交时进行检查
default_stages:
- commit
# 设置默认的语言版本,你也可以在每个repos中单独设置language_version
default_language_version:
python: python3.7
# 设置排除的文件,正则匹配,这个也可以在每个repos中的hooks脚本中单独配置,以灵活实现不同文件对不同规则的检测排除
exclude: "^$"
# 起码顶层配置,一般使用默认值即可。
# 这个repos配置下面的内容,就是最重要的核心配置,下面细说
repos:
- ......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 使用
目录 .git/hooks/pre-commit
添加自动化脚本启动
# 脚本
# npm项目自动更新版本号
const fs = require('fs');
// 读取 package.json 文件
const packageJson = JSON.parse(fs.readFileSync('package.json'));
// 解析版本号
const versionParts = packageJson.version.split('.');
let patchVersion = parseInt(versionParts[2]);
// 自增补丁号
patchVersion++;
// 更新 package.json 中的版本号
packageJson.version = `${versionParts[0]}.${versionParts[1]}.${patchVersion}`;
// 写回 package.json 文件
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2));
console.log('版本号已更新为:', packageJson.version);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
上次更新: 2024/03/27, 13:59:18