1. 先看懂 Angular 提交信息的四段骨架
Angular 提交规范本身不难,难的是每次提交都要临时回忆 type 该填 feat 还是 fix,scope 写的是组件名还是模块名,subject 又不能用大写开头。原文里那套 <type>(<scope>): <subject> 加上 Body、Footer 的格式,很多人靠装 VSCode 的 git-commit-plugin 硬记模板。其实这套规范可以完全交给 Codex:先用 TaoToken 拿一把 API Key,在 Codex 配置里把 Base URL 指到兼容通道,再在提示词里告诉它 Angular 提交规则,以后提交信息自动生成,类型、范围、动机、PR 关联都不用手输。
原文那套规范来自 AngularJS 提交模板,核心是让每一条 commit message 都由 header、body、footer 组成。header 又拆成 type、scope、subject 三个部分,整体长这样:
<type>(<scope>): <subject>
<body>
<footer>
header 是必填项,scope 是可选的。每一行不要超过 100 个字符,否则在 GitHub 和各类 git 工具里阅读时会被截断。很多人记不住的不是格式本身,而是每次提交都要在脑子里过一遍:这次改动算 feat 还是 refactor?影响范围写哪个模块?subject 用不用大写?这些问题原本靠 VSCode 的 git-commit-plugin 手动选模板解决,但装插件、点图标、逐个填 scope/subject/body/footer,一样费时间。
1.1 type 的取值不要死记
原文规定 type 只能是以下之一:feat 表示新功能,fix 表示修 bug,docs 表示只改文档,style 是不影响代码含义的格式调整,refactor 是既没修 bug 也没加功能的代码重构,perf 是性能优化,test 是补测试或改测试,chore 是构建过程或辅助工具的变动。判断方法很简单:先看这次提交会不会让使用者看到新行为,会就是 feat;不会但修了问题,就是 fix;都不是再看是文档、格式、性能还是测试。如果你经常在 feat 和 refactor 之间犹豫,就按"对外有没有新增功能"来切分,这一条规则比背列表更耐用。
1.2 subject、body、footer 各自的语气
subject 是对本次变动的简明描述,必须用祈使句和现在时,首字母小写,末尾不加句号。body 要说明改动的动机,以及跟之前行为有什么差异。footer 只放 breaking changes 或关联的 issue、PR 编号。如果某次提交恢复了之前的提交,开头要以 revert: 作为前缀,正文里写 This reverts commit <hash>.,其中 hash 是被还原的那次提交的 SHA。这些规则单独看都不难,难的是每次提交都要保持同一套表达能力——这正是可以交给模型的活。
2. 让 Codex 成为你的提交信息助手:先拿 Key 再指 Base URL
要做这件事,需要两样东西:一把能调用模型的 API Key,以及一个把 Codex 指向 TaoToken 的配置。TaoToken 是一个兼容通道,提供统一的 API 接入,你不需要同时维护多个供应商的控制台和计费页面。打开 TaoToken 注册并创建 API Key,模型 ID 以官网模型广场当时列表为准。Key 的格式是一串密钥,下文全部用 YOUR_API_KEY 占位,别把它写进任何会提交到仓库的文件。
2.1 Codex 的 Base URL 填什么
Codex 的配置文件在 ~/.codex/config.toml。注意它读的是自己的 model_provider 段,不是 Claude Code 那套 ANTHROPIC_BASE_URL 环境变量。打开文件,把模型提供方指向 TaoToken:
model = "以模型广场列表为准"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
env_key = "TAOTOKEN_API_KEY"
然后执行:
export TAOTOKEN_API_KEY=YOUR_API_KEY
base_url 一定是 https://taotoken.net/api,末尾不要加 /v1,也不要加任何 UTM 参数。这个地址是给程序填的,不是给人点的。给人注册、创建 Key、看模型广场和用量的地址,始终是 TaoToken。
2.2 先跑一条最小请求验证连通
配置保存后,在项目目录里启动 Codex,随便发一句:
请用一行话说明当前 git 状态。
如果 Codex 能正常返回,说明 Key、Base URL、模型 ID 三个点都通了。这一步没通就往下继续配置,后面所有 commit message 生成都建立在这个连接上。返回结果里如果提示某个字段格式不正确,优先回到 config.toml 检查,不要在提示词上反复试错。
3. 把 Angular 模板写进提示词,替代 git-commit-plugin 的逐项填写
原文第 7 节花了很大篇幅介绍 VSCode 的 git-commit-plugin:装插件,配置 GitCommitPlugin.ShowEmoji、CustomCommitType、MaxSubjectCharacters、Templates,提交时点图标选模板,再逐个点击 Scope、Subject、Body、Footer 填入。这套流程的痛点在于模板是静态的,每次还要手动回忆类型、范围、描述语气。现在可以把同样的约束写进 Codex 的提示词,让模型替你完成"选模板 + 填字段"的过程。下面这张对照表可以看到原来的插件配置项在 Codex 场景里落在哪里:
| git-commit-plugin 配置 | Codex 提示词中的替代 |
|---|---|
CustomCommitType | type 取值列表直接写进 AGENTS.md |
MaxSubjectCharacters | subject 不超过 50 个字符的约束 |
Templates | 在角色说明里定义完整模板 |
ShowEmoji | 不开启,保持提交信息整洁 |
3.1 给 Codex 的角色说明
在项目里维护一个 AGENTS.md,或者每次对话开头贴一段角色设定,把原文的规则浓缩成可执行的要求:
根据当前 git diff 生成符合 Angular Commit Message 规范的提交信息。
整体格式:
<type>(<scope>): <subject>
<body>
<footer>
约束:
1. type 只用 feat / fix / docs / style / refactor / perf / test / chore;
2. scope 写本次改动影响的范围,例如组件名、模块名或路由名;
3. subject 用祈使句、现在时,首字母小写,结尾不加句点,不超过 50 个字符;
4. 如果改动动机和之前行为差异明显,必须写 body;
5. footer 只在有 breaking changes 或关联 issue 时出现,并写清 PR / issue 编号;
6. 任何一行不要超过 100 个字符。
这段文本等价于原来插件的 Templates 配置,但比插件灵活得多。插件里的 CustomCommitType 只能约束下拉项,而提示词还能约束语气、长度和 body 的写作动机。
3.2 遇到 revert 场景怎么办
原文单独把"还原"列了一节。Codex 同样能处理:你只需要把 git 给出的 revert 上下文交给它,或者直接在提示词里声明"如果 diff 是 revert 操作,以 revert: 开头,正文说明 This reverts commit ."。把这条加进 3.1 的角色说明里即可,不用每次单独回忆。
3.3 需要长说明时让 Codex 展开 body 和 footer
大多数提交只要 header 就够了。但涉及复杂改动时,追问一句:
这条 diff 的改动动机是什么?请补充 body 和 footer。
Codex 会根据当前 diff 推断前后行为差异,补上动机和关联的 PR、issue 信息。相比在 VSCode 插件里手动把光标移进 Body 输入框再逐字敲,这个方式至少省掉了切换输入框的动作。
4. 跑一条真实 commit message 并对照检查
配置完成提示词后,进入实际验证。这一步不是让你直接提交代码,而是先在 Codex 里生成一条 commit message,拿它和原文规范逐项核对。原文手动操作时靠眼睛检查每一项有没有填对,Codex 场景下你检查的是生成结果,标准不变。
4.1 从 git status 和 git diff 开始
在工作区里准备一个未提交的改动,然后让 Codex 生成提交信息:
codex
进入交互式界面后输入:
查看当前 git status 和 git diff,按 Angular 规范给出一条 commit message。只要 header 就可以。
Codex 会读取工作区改动,输出类似:
feat(user): add password reset link to login page
对照规范检查:feat 是新增功能,user 是影响范围,subject 用了祈使句且首字母小写、没有句号。如果开头第一个字母被 Codex 写成大写,或者类型写成了 update 这种不在列表里的值,说明提示词约束还不够明确,回去把 3.1 里的角色说明再强调一遍。
4.2 检查 body 和 footer 的生成质量
对一次复杂重构,让 Codex 输出完整信息:
按照 Angular 规范,为当前 diff 生成包含 body 的完整 commit message。body 要写动机,footer 如果检测到关联 issue 就补上。
重点看 body 是不是在解释"为什么改",而不是复述 diff 里的代码行。原文特别指出 body 应包含改动动机并和之前行为对比,如果 Codex 生成的 body 只是"修复了一个 bug"这种空话,就追加一句"body 必须说明前后行为差异"。生成完可以按下面这个清单核一遍:
- type 是否在规则列表内
- scope 写的是不是真实影响范围
- subject 首字母小写、末尾无句号
- body 是否解释了动机,而不是重复 diff
- footer 里的 PR / issue 编号是否准确
4.3 合并进真实提交前先给保存路径
生成的信息确认无误后,可以要求 Codex 直接写出完整的 git 命令:
把上面这条 commit message 拼成一条完整的 git commit -m 命令,不要执行。
随后你在本地终端粘贴执行即可。这样 Codex 只负责生成文本,提交动作仍然由你掌控,不会出现模型直接改动你仓库的问题。
5. 出现 401 或找不到模型时,先查这三个地方
第一次接入最常见的三个报错都发生在配置阶段,而且都能在 ~/.codex/config.toml 附近找到原因。
5.1 401 认证失败
如果 Codex 提示认证失败,先确认 YOUR_API_KEY 是否真的被替换成了在 TaoToken 创建的 Key,以及 export TAOTOKEN_API_KEY 是否在同一个终端会话里执行过。环境变量没生效的表现是:Codex 能启动,但一发请求就返回 401。
5.2 Base URL 末尾多写了 /v1
有些兼容接口的文档会让你在地址后加 /v1,但 TaoToken 的 Base URL 统一是 https://taotoken.net/api,多写 /v1 会导致路由拼接错误。检查 ~/.codex/config.toml 里 base_url 的值,不要带 UTM,也不要带路径尾巴。
5.3 模型 ID 和模型广场对不上
model 字段没有放之四海而皆准的值,不同时期的可用模型列表会变。务必打开 TaoToken 的模型广场,以当时展示的模型 ID 为准,不要凭记忆填官方命名规则的猜测值。模型 ID 填错时通常返回 model not found 或类似错误,换回正确 ID 即可,不需要重新配置整份 config.toml。
配置稳定后,日常流程就变成了:写完代码,git add,在 Codex 里说一句"按规范生成 commit message",复制粘贴提交。相比在 VSCode 里装插件、点模板、逐个填 Scope/Subject/Body/Footer,省掉的是每一次对模板的重新回忆。如果后面发现生成结果偶尔不符合预期,把本文 3.1 的约束再加严即可。
需要长期写代码的话,可以在 TaoToken 模型对话 里先试用同一把 Key 的效果;用量较大再查看 Coding Plan 是否更划算。Key 的管理始终在 控制台 API Keys,换新 Key 后记得重新执行一次 export。




被折叠的 条评论
为什么被折叠?



