用户可借助此项目在提交代码前进行自动化检查与修复,保障代码质量。项目提供多种实用钩子,仅依赖 Python 标准库,支持离线运行且启动快速。【此简介由AI生成】
openubmc-pre-commit-hooks
面向 openUBMC 的 pre-commit 钩子集合。本仓库只提供 openUBMC 专属、官方 pre-commit 生态中没有 的钩子;通用的代码卫生类钩子请直接引用官方仓库(见下文「推荐的官方 hooks」)。
所有钩子仅依赖 Python 标准库,零网络依赖、完全离线运行;采用 language: script 直接执行脚本,无需为钩子创建虚拟环境,启动更快。
特性
- 零依赖:仅使用 Python 标准库,无需安装任何第三方包
- 离线运行:首次克隆源码到本地缓存后,执行钩子不再联网
- 轻量快速:
language: script直接执行,不构建虚拟环境 - 跨平台:纯 Python 实现,Windows / macOS / Linux 均可运行
提供的钩子
| ID | 作用 | 阶段 | 自动修复 |
|---|---|---|---|
| conventional-commit | 校验提交信息符合 Conventional Commits 规范 | commit-msg | 否 |
| add-signoff-and-change-id | 在 commit message 末尾追加 Signed-off-by 和 Change-Id | commit-msg | 是 |
| check-sr | 校验 .sr 文件语法(支持 C 风格注释) | pre-commit | 否 |
快速开始
1. 安装 pre-commit
pip3 install --user pre-commit
2. 在仓库根目录创建 .pre-commit-config.yaml
repos:
- repo: https://gitcode.com/Polaris404/pre-commit-hooks
rev: 0.1.0 # 按需锁定到具体版本
hooks:
- id: conventional-commit
- id: add-signoff-and-change-id
完整的推荐组合(含官方代码卫生 / clang-format / ruff)见仓库根目录的 .pre-commit-config.yaml 示例文件。
3. 安装 git 钩子
本仓库的两个钩子都在 commit-msg 阶段运行:
pre-commit install --hook-type commit-msg
如同时启用通用代码卫生类钩子(pre-commit 阶段),还需执行
pre-commit install。
4. 验证
pre-commit run --all-files
pre-commit run --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG
钩子详解
conventional-commit
强制提交信息遵循 Conventional Commits 规范。格式:
type(scope)!: 简短描述
- type(必填):
feat/fix/docs/style/refactor/perf/test/build/ci/chore/revert - scope(可选):影响范围
- !(可选):表示不兼容变更
- 允许 GitCode MR 编号前缀,如
!123 feat: xxx
可通过参数限定允许的 type:
- id: conventional-commit
args: [feat, fix, docs, refactor]
add-signoff-and-change-id
在 commit message 末尾自动追加两个 trailer(幂等,已存在则跳过):
Signed-off-by: <name> <email>— 取自git config user.name/user.email。- 若两者任一为空,打印警告并跳过此 trailer(不阻断提交)。
- 若最后非空行已是 trailer(
Co-Authored-By/Signed-off-by/Change-Id/Reviewed-by/Tested-by/Acked-by),直接紧随其后;否则在正文与 trailer 之间插入一个空行分隔符。
Change-Id: I<40 位十六进制>— 取 20 字节随机数据的 SHA-1,前缀I。- 与 litebmc/pre-commit-hooks 行为一致;幂等。
执行后效果示例:
feat(parser): 支持 CSR-058 字段
补全解析器对 CSR-058 的处理,覆盖读写两条路径。
Signed-off-by: Alice <alice@example.com>
Change-Id: Ia1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
check-sr
校验 .sr 文件(openUBMC CSR 组件自描述 / PSR 产品自描述记录)的语法。.sr 的实质是 JSONC:标准 JSON + C 风格注释。参考 CSR 文档。
工作流程:
- 以
utf-8-sig读取(自动剥除 BOM)。 - 用 6 状态有限状态机剥离
//行注释与/* */块注释,正确跳过字符串字面量内部的注释标记(例如{"url": "https://example.com"}中的//不会被误删)。 - 用标准库
json.loads解析。
特性与约束:
- 纯标准库实现,无
json5/jsonc等第三方依赖,执行环境无关。 - 严格模式:仅容忍注释。剥离注释后必须是标准 JSON,不支持尾逗号、单引号字符串、裸 key、十六进制数字。
- 失败时打印
<filepath>: <json 错误消息>(自带行列号),不做位置重映射。 - pre-commit 通过
files: '\.sr$'过滤,仅把暂存的.sr文件传给本钩子。
推荐的官方 hooks
通用能力请直接引用官方仓库,无需在本仓库重新实现:
| 用途 | 仓库 | 推荐 rev | hook id |
|---|---|---|---|
| 代码卫生(行尾空格 / EOF / 大文件 / JSON / YAML / 私钥 / 大小写冲突 / 合并冲突标记) | https://github.com/pre-commit/pre-commit-hooks |
v6.0.0 |
trailing-whitespace、end-of-file-fixer、check-merge-conflict、check-added-large-files、check-case-conflict、check-json、check-yaml、detect-private-key |
| C/C++ 格式化 | https://github.com/pre-commit/mirrors-clang-format |
v22.1.5 |
clang-format |
| Python 静态检查 + 格式化 | https://github.com/astral-sh/ruff-pre-commit |
v0.15.17 |
ruff-check、ruff-format |
为什么推荐 Ruff:单一工具同时替代 flake8 + pylint + isort + black,速度比传统组合快 10–100 倍,自带安全自动修复,配置最简。仓库根目录的 .pre-commit-config.yaml 已给出可直接复制的组合示例。
新开发机一次性配置(推荐)
pre-commit install 需要每个仓库单独执行。如果同时维护多个仓库、不想每次 clone 后都手动安装,可以配置 git 模板目录,让此后所有新 clone / init 的仓库自动带上钩子:
# 1. 指定 git 模板目录
git config --global init.templateDir ~/.git-template
# 2. 把 pre-commit 钩子写入模板目录
pre-commit init-templatedir ~/.git-template
pre-commit init-templatedir --hook-type commit-msg ~/.git-template
完成后再 git clone 任何 openUBMC 仓库,钩子会自动生效,无需再手动 pre-commit install。
说明:
- 对没有
.pre-commit-config.yaml的仓库(如非 openUBMC 项目),pre-commit 会自动跳过、不报错,不影响正常提交。 - 仅对此后新 clone / init 的仓库生效;此前已存在的仓库仍需手动
pre-commit install。 pre-commit工具本身仍需先pip3 install --user pre-commit安装。
团队协作
.pre-commit-config.yaml 随仓库分发后,新成员只需:
pip3 install --user pre-commit
pre-commit install
pre-commit install --hook-type commit-msg
环境要求
- pre-commit >= 3.0.0
- Python >= 3.9