1. 这个工具要解决什么问题
1.1 先聊点糟心事:你的 Git 提交记录是不是也长这样
我最近在复盘一个半年期的项目时,被 git log 折磨得不轻。翻出来的提交信息大概有这些类型:“改一下”“update”“asdf”“fix bug”“代码微调”,还有一些直接是空的。说实话,看到这种记录,我连 blame 的欲望都没有——就算定位到某一行是哪个 commit 改的,也完全猜不到当时为什么要这么改。
Git 提交信息这件事,看起来不起眼,实际上直接影响一个项目的可维护性。它承担着三个任务:第一,给未来的自己当“记忆索引”;第二,给 Code Review 的人提供上下文;第三,为自动生成 CHANGELOG、语义化版本号、自动关闭 Issue 这些能力提供数据基础。提交信息一旦乱掉,后面做版本管理、问题追溯都是两眼一抹黑。
很多团队不是不想规范提交信息,而是“规范成本”太高。靠人自觉不靠谱,开会强调只管用三天;靠 Code Review 人工检查,reviewer 自己都经常忘;真正有效的办法是在工具层面做强制校验,让不规范的提交根本进不了仓库。gitru 就是朝这个方向走的一个工具。
gitru 是用 Rust 写的零依赖 Git 提交信息校验工具。它解决的问题非常聚焦:在你提交代码的时候,自动检查 commit message 符不符合团队约定。我把玩了一段时间,也接进了自己的工作流,今天这篇文章就聊聊这个工具的设计思路、使用方式和一些实际落地时容易踩的坑。
1.2 gitru 是干什么的,适合什么人用
先给一句话定位:gitru 是一个“只做提交信息格式校验”的命令行工具,不接管 Git 命令,不push,不自动改代码。它做的事情可以理解为给 commit message 加一道闸门:格式对了放行,格式错了报错并提示你应该怎么写。
这类工具在实际工作里相当有存在感。如果你是个人开发者,想让自己的项目记录干净、方便以后回溯,gitru 可以在本地帮你养成习惯;如果你是团队负责人或者 CI 维护者,gitru 可以部署在 Git Hook 或流水线里,作为合并代码前的一道自动检查;如果你是开源项目维护者,也可以用它给外部贡献者设立一个明确的提交门槛。
很多刚接触的人会问,这玩意儿和 commitlint 有什么区别?区别主要在运行环境。commitlint 是 Node.js 生态的,安装后下面挂着一堆依赖包;gitru 则把自己编译成了一个二进制文件,不需要额外装解释器。对一个只想“校验提交信息”的简单需求来说,gitru 的思路更干净。
我在实际使用中最喜欢它的地方是:够轻、够快、够安静。不会在你每次 git commit 的时候拖几秒钟,也不会突然报一堆依赖版本冲突。它就是一个放在 PATH 里的小程序,你写完提交信息,它帮你把关。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么用 Rust 写,又为什么要做到零依赖
2.1 从 commitlint 到 gitru:选型不是跟风
先说一个很多团队的普遍痛点。现在大家在 Git 提交校验上用得最多的工具是 commitlint,但它依赖 Node 环境。你去 npm 仓库装一个 commitlint 相关的包,会看到它背后的依赖树可能比你项目本身的依赖还多。在本地机器上这还能忍,放到 CI 流水线里就比较烦了:镜像要额外装 Node,node_modules 要重新拉一遍,版本稍微不一致还会出现行为差异。
另一个常见工具 gitlint 是用 Python 写的,也存在类似的解释器依赖问题。Python 版本、pip 源、虚拟环境……这些跟“提交信息校验”本意毫无关系的事,反而成了使用成本的大头。
gitru 用 Rust 写,解决的正是这种“为一个简单诉求背上复杂环境”的尴尬。Rust 可以静态编译,编完就是一个独立的可执行文件,不仅不需要 Node、Python 这类运行时,连运行时库都基本不带。拿到哪个平台都能跑,行为一致,升级就是换一个文件。
有人可能觉得这是“为了 Rust 而 Rust”。但站在工程角度,这个选型相当合理。提交校验是一个极其高频、低延迟敏感、又希望稳定可分发的小工具,Rust 在这种场景下的优势恰好全中:编译产物单文件、启动快、内存安全、错误处理机制完善。它不是用锤子去砸钉子,而是这个钉子刚好适合 Rust 这把锤子。
2.2 零依赖到底意味着什么
“零依赖”这四个字,普通用户可能没太多感觉,但做过发布管理的人会非常敏感。一个工具依赖越少,意味着它的攻击面越小、故障点越少、生命周期越好维护。
对一个命令行校验工具来说,零依赖的直接好处有三个。第一,供应链风险极低。npm 生态里每年都会出现依赖包被恶意篡改的事件,一个包底下挂着几百个依赖,其中某个被攻破,整个 CI 就危险了。git
