更轻量级的git hooks方案

在参与开源项目 Earthworm 开发过程中,认领了一个 issue 任务,添加 commit 规范&检查&生成changelog,参见 github.com/cuixueshe/e...

当时给出的实现还是基于 husky 作为 git hooks 方案,但是相较于本文介绍的 simple-git-hooks,体量上不够轻量。

simple-git-hooks

官网地址:github.com/toplenboren...

它给出的包体量比较,如下,可见 simple-git-hooks 真的很小。

Usage

新建一个项目hooks-demo,进入项目,执行 pnpm 初始化操作生成 package.json

csharp 复制代码
pnpm init

安装 simple-git-hooks 等依赖,

sql 复制代码
pnpm add simple-git-hooks -D
pnpm add typescript -D
pnpm add @types/node -D
pnpm add tsx -D

package.json 添加 simpe-git-hooks 字段,触发 git hooks,

json 复制代码
"simple-git-hooks": {
  "commit-msg": "npx tsx ./scripts/verify-commit.ts"
},

在 commit-msg 钩子中执行,scripts 文件夹下的 verify-commit 文件。依目录新建,verify-commit.ts 代码如下:

javascript 复制代码
import pico from "picocolors";
import { readFileSync } from "node:fs";
import path from "node:path";

const msgPath = path.resolve(".git/COMMIT_EDITMSG");
const msg = readFileSync(msgPath, "utf-8").trim();

const commitRE =
  /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release)((.+))?: .{1,50}/;

if (!commitRE.test(msg)) {
  console.log(pico.yellow(`\n你提交的信息: ${msg}\n`));
  console.error(
    `  ${pico.white(pico.bgRed(" 错误 "))} ${pico.red(
      `无效的提交信息格式.`
    )}\n\n` +
      pico.red(`  正确的提交消息格式. 例如:\n\n`) +
      `    ${pico.green(`feat: add a new feature`)}\n` +
      `    ${pico.green(`fix: fixed an interaction bug`)}\n\n` +
      pico.red(
        `我们参考了Vue3的方案.\n` +
          `访问 https://github.com/vuejs/core/blob/main/.github/commit-convention.md 查看更多细节.\n`
      )
  );
  process.exit(1);
}

以上代码,使用了 picocolors,这个库用于在终端进行颜色标注的输出格式化。需要下载安装一下,

csharp 复制代码
pnpm add picocolors -D

通过node:path读取文件 .git/COMMIT_EDITMSG,从中可以获取 git commit 信息,但是此时我们的 demo 项目还没有初始化git init,也没有进行远程仓库的映射。这部操作网上教程很多,简单说一下,github 上新建一个仓库,拿到这个仓库的地址,在本地仓库下执行 git remote add进行映射。

其中commitRE是正则表达式,用于匹配符合一定规则的提交消息,具体解释如下:

  • ^:表示匹配字符串的开头。
  • (revert: )?:这是一个可选部分,匹配以 "revert: " 开头的字符串,表示回滚提交。
  • (feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release):这是一个捕获组,它匹配以下单词中的任意一个:
diff 复制代码
-   feat:表示新增功能。
-   fix:表示修复 bug。
-   docs:表示更新文档。
-   dx:表示改进开发者体验。
-   style:表示修改样式。
-   refactor:表示重构代码。
-   perf:表示性能优化。
-   test:表示添加或修改测试。
-   workflow:表示改进工作流程。
-   build:表示修改构建系统或外部依赖。
-   ci:表示修改持续集成配置文件或脚本。
-   chore:表示其他杂项任务。
-   types:表示修改类型定义文件(如 TypeScript)。
-   wip:表示进行中的工作,尚未完成。
-   release:表示发布新版本。
  • ((.+))?:这是一个可选部分,匹配括号中的内容,表示作用域或影响范围。括号内的内容可以是任意字符。
  • ::表示冒号,用于分隔提交类型和提交说明。
  • .{1,50}:表示匹配任意字符,长度在 1 到 50 之间,表示提交说明的文本内容。

如果你的commit提交信息不正确,就会给出下列的错误提示,这儿完全可以自定义你想在终端输出的内容。

Test

最后我们来测试一下,按照不合法的 commit msg 进行提交,commit 之后查看终端显示,

发现 commit 信息并不合法,但是还是成功提交,说明我们配置的 git-hooks 没有生效。

执行如下操作:

bash 复制代码
# [Optional] These 2 steps can be skipped for non-husky users
git config core.hooksPath .git/hooks/
rm -rf .git/hooks

# Update ./git/hooks
npx simple-git-hooks

撤销上次的提交,再次验证,

终端成功显示出,scripts/verify-commit.ts 中自定义的报错内容。至此,simple-git-hooks 使用成功。

相关推荐
木斯佳8 分钟前
前端八股文面经大全:京东前端实习一面(2026-04-16)·面经深度解析
前端
chenxu98b9 分钟前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
Bigger14 分钟前
第十章:我是如何剖析 CLI 里的终极 Agent 能力的(电脑控制与浏览器接管)
前端·claude·源码阅读
kyriewen16 分钟前
代码写成一锅粥?这5种设计模式让你的项目“起死回生”
前端·javascript·设计模式
蓝色的雨20 分钟前
基于Babylonjs的WEBGPU渲染器源码架构
前端·javascript
浇头面加面20 分钟前
📊 流式输出实现总结
前端
IT_陈寒41 分钟前
Java集合的这个坑,我调试了整整3小时才爬出来
前端·人工智能·后端
前端老石人1 小时前
前端网站换肤功能的 3 种实现方案
开发语言·前端·css·html
冴羽yayujs1 小时前
2026 年的 JavaScript 已经不是你认识的 JavaScript 了
前端·javascript
小灰灰搞电子1 小时前
PyQt QWebChannel详解-C++与Web页面的无缝双向通信
前端·pyqt