AI自动生成Git提交信息:基于Conventional Commits规范的工具实践
2026/5/10 7:38:45 网站建设 项目流程

1. 项目概述与核心价值

如果你和我一样,每天都要和 Git 打交道,那你肯定也经历过这样的时刻:盯着git status里那一堆修改过的文件,大脑一片空白,不知道该给这次提交起个什么名字。是写“修复了一个 bug”还是“优化了某个功能”?要不要遵循 Conventional Commits 规范?scope 怎么写?body 部分要不要加?这些问题看似琐碎,但一个清晰、规范的提交信息,对于团队协作、代码回溯和自动化生成 CHANGELOG 来说,价值巨大。今天要聊的这个工具,guanguans/ai-commit,就是来解决这个痛点的。它本质上是一个命令行工具,核心功能是利用 AI 自动为你生成符合 Conventional Commits 规范的 Git 提交信息

简单来说,你写完代码,执行git add .之后,不用再绞尽脑汁想提交信息了。直接运行ai-commit,它会分析你本次的代码变更(git diff),然后调用你配置好的 AI 服务(比如 OpenAI 的 GPT 系列、百度的文心一言、GitHub Copilot 等),生成一条格式规范、语义清晰的提交信息。你只需要确认一下,它就能帮你完成提交。这不仅仅是“偷懒”,更是将提交信息的质量从“依赖开发者自觉”提升到了“工具辅助下的标准化输出”。对于追求工程效能和代码库规范性的团队或个人开发者而言,这是一个能显著提升体验和产出质量的利器。

2. 核心设计思路与方案选型

2.1 为什么是 AI + Conventional Commits?

传统的提交信息生成工具,比如commitizen,主要通过交互式问答来引导用户填写信息。这种方式虽然能保证格式,但内容的质量和准确性完全取决于开发者对自己修改的理解和描述能力。而 AI 的引入,改变了游戏规则。AI 模型,特别是经过代码训练的 LLM(大语言模型),具备理解代码上下文和语义的能力。它能“阅读”你的git diff,理解你究竟修改了什么:是新增了功能、修复了错误、改进了性能,还是仅仅调整了代码格式。

ai-commit巧妙地将这两者结合。它的目标不是生成一段随意的描述,而是生成符合 Conventional Commits 规范的描述。这个规范定义了提交信息的固定结构:type(scope): subject,后面可以跟可选的bodyfooter。其中type是固定的几种(如 feat, fix, docs 等),scope说明影响范围,subject是简洁的概要。AI 的任务就是根据代码变更,准确地判断出type,提炼出合适的scopesubject,并补充详细的body。这种设计确保了生成的信息既智能又规范,可以直接用于自动化流程。

2.2 架构设计与技术栈解析

ai-commit是一个用 PHP 编写的命令行工具。选择 PHP 可能让一些非 PHP 生态的开发者感到意外,但这恰恰体现了它的一个优势:依赖简单,易于分发。它基于成熟的 PHP 命令行应用框架 Symfony Console 构建,这为它提供了强大的命令定义、参数解析、输入输出和彩色终端支持。

它的核心架构是“生成器(Generator)插件化”。工具本身不绑定任何一家 AI 服务,而是定义了一套统一的生成器接口。目前官方支持了市面上主流的 AI 服务接口:

  • OpenAI / OpenAI Chat: 对应 GPT-3.5/4 等模型。
  • ERNIE-Bot / ERNIE-Bot-turbo: 百度的文心一言模型。
  • Moonshot: 月之暗面公司的 Kimi 等模型。
  • GitHub Copilot CLI / GitHub Models CLI: 直接利用 GitHub 的 AI 能力。
  • Bito CLI: 另一个 AI 编码助手工具的命令行版本。

这种设计非常灵活。你可以根据网络环境、费用、效果偏好来选择不同的“引擎”。工具内部会处理与这些 API 的通信,将git diff内容、预设的提示词(Prompt)封装成请求,发送给 AI,再解析返回的 JSON 或文本,提取出结构化的提交信息。

注意:这里有一个关键点,ai-commit本身不包含任何 AI 模型,它只是一个“调度器”和“格式化器”。你需要自行拥有这些 AI 服务的 API Key 或访问权限,并配置到工具中。这避免了法律和版权风险,也让工具保持轻量和专注。

3. 从零开始:安装与基础配置实战

3.1 两种安装方式详解

根据你的使用习惯,有两种主要的安装方式。

方式一:直接下载二进制文件(推荐给所有用户)这是最简单快捷的方式,无需 PHP 环境。工具作者已经将 PHP 代码和依赖打包成了一个独立的、可执行的二进制文件(PHAR 格式)。

# 下载最新版的 ai-commit 可执行文件 curl -L 'https://github.com/guanguans/ai-commit/releases/latest/download/ai-commit.phar' -o ai-commit # 赋予执行权限 chmod +x ai-commit # 移动到系统 PATH 目录,方便全局调用(例如 /usr/local/bin) sudo mv ai-commit /usr/local/bin/

执行后,你就可以在终端任何位置直接输入ai-commit来使用它了。这种方式隔离了环境,最省心。

方式二:通过 Composer 安装(适合 PHP 开发者)如果你本身就在 PHP 项目中使用 Composer,或者希望将ai-commit作为某个项目的开发依赖,可以使用这种方式。

# 全局安装(在任何目录都可使用) composer global require guanguans/ai-commit --dev # 或者在特定项目内安装 cd your-project composer require guanguans/ai-commit --dev

全局安装后,你需要确保 Composer 的全局vendor/bin目录在你的系统 PATH 中。通常安装时会提示你。项目内安装后,你可以通过./vendor/bin/ai-commit来运行。

3.2 核心配置:连接你的 AI 大脑

安装只是第一步,要让工具工作,你必须告诉它使用哪个 AI 服务以及如何认证。所有配置都通过ai-commit config set命令完成,建议加上--global标志保存到全局配置,一劳永逸。

以配置 OpenAI 为例:假设你拥有 OpenAI 的 API Key(以sk-...开头)。

# 设置 OpenAI API Key ai-commit config set generators.openai.api_key sk-your-actual-openai-api-key-here --global # 设置默认使用的生成器为 openai ai-commit config set generator openai --global

这里有两个关键配置项:

  1. generators.openai.api_key: 这是针对openai这个生成器的具体配置,键名必须完全匹配。
  2. generator: 这是指定默认使用哪个生成器。上面例子中,设置后,每次运行ai-commit commit就会默认调用 OpenAI。

配置其他生成器:原理相同,只是键名和所需参数略有差异。

  • 百度文心一言:你需要去百度智能云创建应用获取 API Key 和 Secret Key。ai-commit通常只需要api_key,但百度的实际调用可能需要api_keysecret_key组合成 Access Token。你需要查阅ai-commit关于 ERNIE 的详细文档,看它是否支持自动获取 Token,还是需要你预先获取并配置。
    ai-commit config set generators.ernie_bot.api_key your-baidu-api-key --global ai-commit config set generators.ernie_bot.secret_key your-baidu-secret-key --global # 如果需要
  • GitHub Copilot CLI: 这需要你先安装官方的gh命令行工具,并通过gh auth login登录,以及安装 Copilot CLI 插件 (gh extension install github/gh-copilot)。配置ai-commit时,主要是告诉它gh二进制文件的位置(如果不在默认 PATH 里)。
    ai-commit config set generators.github_copilot_cli.binary /usr/local/bin/gh --global
  • Moonshot(Kimi): 去月之暗面平台获取 API Key。
    ai-commit config set generators.moonshot.api_key your-moonshot-api-key --global

实操心得:我强烈建议在配置完成后,运行ai-commit config list --global查看所有配置项,确认你的 API Key 等敏感信息已正确保存(显示为******)。同时,首次使用某个生成器前,最好在测试仓库用小改动试一下,避免因为网络、额度或配置问题导致常规提交失败。

4. 深度使用:命令解析与高级技巧

4.1commit命令:核心工作流拆解

运行ai-commit commit是主要的使用场景。让我们深入看看它背后做了什么,以及有哪些可调控的选项。

默认流程:

  1. 收集差异:工具会在当前 Git 仓库中执行git diff --staged(如果你已git add)或git diff(针对未暂存的变化,但需要你确认),获取本次要提交的代码变更内容。
  2. 构建提示词:工具会将diff内容与一个预设的“提示词模板”结合。这个模板的核心是要求 AI 按照 Conventional Commits 格式分析diff并生成提交信息。默认的提示词(conventional)已经过优化,能引导 AI 产出高质量结果。
  3. 调用 AI:根据你的配置,工具将组装好的请求发送给对应的 AI 服务 API。
  4. 解析与展示:收到 AI 的回复后,工具会尝试从中提取出subjectbody,并以一个清晰的表格形式在终端中展示出来。
  5. 交互确认:工具会问你是否使用这个生成的提交信息。你可以选择yes直接提交,no放弃,或者在此时手动编辑信息。
  6. 执行提交:确认后,工具执行git commit -m “生成的提交信息”完成提交。

常用选项详解:

  • --generator-g: 这是最重要的选项之一,用于临时指定本次提交使用的 AI 生成器,覆盖全局默认设置。例如你默认用 OpenAI,但某个项目想用 Kimi,可以ai-commit commit -g moonshot
  • --no-edit: 这个选项非常有用。加上它,工具在生成信息后,将跳过交互确认环节,直接使用 AI 生成的信息进行提交。这适合在脚本中或当你非常信任 AI 生成结果时使用。但请谨慎,务必先在不重要的分支上验证几次生成质量。
  • --no-verify: 它会将--no-verify参数传递给内部的git commit命令,从而绕过你项目中可能设置的 Gitpre-commitcommit-msg钩子。
  • --diff-options: 允许你传递参数给内部的git diff命令。默认值已经非常贴心::!*-lock.json :!*.lock :!*.sum,这意味着它会自动忽略 package-lock.json、yarn.lock、go.sum 等依赖锁文件的变化。因为这些文件通常是自动生成的,其变化不应影响提交信息的语义。你可以根据项目需要扩展这个列表。
  • --dry-run:试运行模式。使用此选项,工具会完成生成和展示提交信息的全部步骤,但最终不会执行git commit。这是测试配置和生成效果的安全方式。
  • --prompt-p: 指定使用不同的提示词模板。工具可能内置了多种针对不同场景优化的提示词(如简洁模式、详细模式、非代码文件模式等)。你可以通过源码或文档查看有哪些可用的prompt

4.2 配置管理:config命令全掌握

ai-commit的配置系统是其灵活性的基石。所有配置都通过ai-commit config子命令管理。

  • 查看配置ai-commit config list会列出所有当前生效的配置(包括全局和本地)。敏感信息如 API Key 会显示为星号。
  • 获取配置ai-commit config get generator可以查看generator这个具体配置项的值。
  • 设置配置:如前所述,ai-commit config set key value --global--global表示存储在用户家目录下的全局配置文件,对所有项目生效。不加--global则会在当前目录下寻找或创建.ai-commit/config.json文件,实现项目级配置。这个特性非常有用,比如公司项目统一用 ERNIE,个人项目用 OpenAI,就可以在不同目录设置不同的默认生成器。
  • 编辑配置ai-commit config edit会用默认的文本编辑器打开配置文件,方便进行批量修改或查看原始 JSON 结构。

4.3 其他实用命令

  • self-update: 如果你是通过下载二进制文件安装的,这个命令可以一键检查并更新到最新版本。
  • completion: 生成 Shell 自动补全脚本(支持 Bash, Zsh),安装后可以按 Tab 键补全命令和选项,提升使用效率。
  • thanks: 一个彩蛋命令,显示致谢信息。

5. 实战场景与个性化调优

5.1 集成到日常 Git 工作流

仅仅会运行命令还不够,如何让它无缝融入你的开发习惯才是关键。

方案一:替换git commit别名在你的 Shell 配置文件(如~/.zshrc~/.bashrc)中添加别名:

alias gc='ai-commit commit' # 或者,如果你希望默认跳过编辑,直接使用AI生成的信息提交(高风险,请先测试) alias gca='ai-commit commit --no-edit'

这样,你平时输入git commit -m “msg”的地方,就可以尝试用gc来代替了。

方案二:作为 Git Hook 自动触发一个更自动化的思路是利用 Git 的prepare-commit-msg钩子。这个钩子在git commit命令启动后,打开编辑器让用户输入提交信息之前执行。你可以编写一个脚本,在这个钩子中调用ai-commit生成信息,并将其作为默认信息填入提交模板。

  1. 在你的项目或全局 Git 模板目录的hooks文件夹中,创建prepare-commit-msg文件。
  2. 脚本内容大致如下:
    #!/bin/bash # 获取提交信息文件路径 COMMIT_MSG_FILE=$1 # 使用 ai-commit 生成信息(dry-run 模式,只生成不提交) GENERATED_MSG=$(ai-commit commit --dry-run --no-edit 2>/dev/null | grep -A 10 “subject” | tail -n +2 | sed ‘/^$/d’ | head -1) # 如果成功生成,且当前提交信息文件为空(即不是 amend 等情况),则写入 if [ -n “$GENERATED_MSG” ] && [ ! -s “$COMMIT_MSG_FILE” ]; then echo “$GENERATED_MSG” > “$COMMIT_MSG_FILE” fi
  3. 赋予脚本执行权限:chmod +x prepare-commit-msg。 这样,每次你执行git commit(不带-m参数),打开编辑器时,第一行就已经有了 AI 生成的建议信息,你可以直接使用或在其基础上修改。

注意事项:Git Hook 方案虽然自动化程度高,但有一定复杂性,且可能干扰你某些特定的提交场景(如合并冲突、修改提交)。建议先在个人项目或测试分支上充分验证。

5.2 提示词(Prompt)调优与自定义

AI 生成质量的核心在于提示词。ai-commit默认的conventional提示词已经不错,但你可能希望它更符合你团队的规范,或者对某些类型的变更(如文档更新、测试代码)有更特定的描述风格。

查看默认提示词:你可以去项目的 GitHub 仓库源码中,查找Prompts相关的类或配置文件,了解其具体内容。通常它会包含:

  • 指令:要求 AI 扮演的角色(如“你是一个经验丰富的软件工程师”)。
  • 任务:分析git diff并生成 Conventional Commits 信息。
  • 格式:严格要求输出为 JSON,包含subjectbody字段。
  • 示例:可能会给出一两个diff和对应提交信息的例子,让 AI 学习。

自定义提示词ai-commit可能支持通过配置或扩展来使用自定义提示词。如果官方支持,你可以在配置中指定一个本地提示词模板文件的路径。自定义时,可以强调以下几点来提升效果:

  • 强调 Scope:要求 AI 尽可能识别出变更影响的模块或组件作为 scope。
  • Body 格式:要求 body 部分用列表形式(-)清晰罗列关键变更点。
  • 语言:指定生成中文或英文提交信息。
  • 忽略项:再次强调忽略版本锁文件、自动生成的代码等。

5.3 多生成器策略与降级方案

你可以配置多个生成器的 API Key。那么如何选择呢?

  • 网络与速度:OpenAI 的 API 在国内访问可能不稳定或慢,此时 ERNIE 或 Moonshot 可能是更好的选择。Copilot CLI 依赖于 GitHub 的可用性。
  • 成本:不同模型的定价不同。对于提交信息生成这种短文本任务,使用更便宜的模型(如 GPT-3.5-turbo 对比 GPT-4)通常效果足够好,可以节省成本。
  • 效果偏好:你可以实际测试对比。有些模型可能对代码上下文的理解更精准,有些生成的描述更自然。找到最适合你项目代码风格的模型。

一个实用的策略是设置一个“降级链”。例如,在配置或脚本中,优先尝试 Copilot CLI(如果已登录且可用),失败则尝试 OpenAI,再失败则尝试 ERNIE。ai-commit本身可能不直接支持这种自动降级,但你可以通过编写一个简单的 Shell 函数包装器来实现。

6. 常见问题排查与优化实录

即使配置正确,在实际使用中也可能遇到各种问题。这里记录一些我踩过的坑和解决方案。

6.1 生成内容不准确或格式错误

现象:AI 生成的type不对(明明是修复 bug 却生成了feat),或者subject描述过于笼统(如“更新了代码”),或者没有生成有效的 JSON 导致工具解析失败。

排查与解决

  1. 检查git diff内容:首先运行git diff --stagedgit diff,看看工具到底把哪些变更发送给了 AI。如果diff内容过于庞大或包含大量无关的空白字符修改、自动生成文件,AI 很难抓住重点。解决方案:提交前做好代码整理,使用--diff-options过滤掉无关文件。
  2. 提示词问题:默认提示词可能不适合你的项目类型(比如前端、后端、基础设施代码风格差异大)。解决方案:尝试使用--prompt参数(如果有其他内置选项),或者考虑自定义提示词。
  3. AI 模型能力:不同的模型和版本能力有差异。例如,GPT-4 通常比 GPT-3.5 在代码理解上更准确。解决方案:如果使用 OpenAI,可以在配置中指定更强大的模型,如generators.openai.model=gpt-4。注意这会产生更高费用。
  4. 重试机制ai-commit内置了--retry-times--retry-sleep选项。如果因为网络抖动或 API 临时问题导致生成失败或格式错误,可以自动重试。适当增加重试次数(如--retry-times=5)可以提高成功率。

6.2 API 调用失败与网络问题

现象:工具卡在“Generating commit message...”很久,然后报错,提示网络超时、认证失败或额度不足。

排查与解决

  1. 验证 API Key:运行ai-commit config get generators.openai.api_key(替换为你的生成器)确认 Key 配置正确。对于 OpenAI,你可以用curl简单测试:
    curl https://api.openai.com/v1/models \ -H “Authorization: Bearer YOUR_API_KEY”
    如果返回401错误,说明 Key 无效或过期。
  2. 网络代理:如果你在国内使用需要境外访问的 API(如 OpenAI),需要确保命令行环境能通过代理访问。为curl和命令行工具设置代理环境变量:
    export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
    然后再次运行ai-commit commit。注意,ai-commit内部可能使用 PHP 的 HTTP 客户端,确保 PHP 的流上下文也能识别这些代理设置,有时需要在 PHP 代码或配置中单独设置。
  3. 查看详细日志:使用-vvv选项运行命令,可以输出最详细的调试信息,包括发送的请求和接收的响应,这对于定位问题至关重要。
    ai-commit commit -vvv --dry-run
  4. 降级或切换生成器:如果某个服务持续不可用,考虑切换到备用的生成器。

6.3 与现有 Git 工具链的冲突

现象:项目使用了husky设置了commit-msg钩子来运行commitlint,校验提交信息格式。ai-commit生成的格式可能不满足所有commitlint规则(如subject长度、scope格式等),导致提交被拒绝。

排查与解决

  1. 了解规则:首先检查项目的commitlint.config.js文件,了解具体的规则要求。
  2. 调整提示词:尝试优化提示词,让 AI 生成的信息更严格地符合这些规则。例如,在提示词中明确要求“subject不超过 50 个字符”,“scope必须是小写字母或连字符”等。
  3. 使用--no-verify:在确认 AI 生成的信息基本符合要求,只是某些次要规则(如末尾句号)偶尔不符合时,可以在运行ai-commit时加上--no-verify选项,临时绕过钩子检查。但这只是权宜之计,会降低代码库规范的一致性。
  4. 调整工具链顺序:考虑将ai-commit作为生成建议的工具,而commitlint作为校验工具。可以这样整合:在prepare-commit-msg钩子中调用ai-commit生成建议信息,然后仍然由commit-msg钩子中的commitlint进行校验。如果校验不通过,提交会被中断,你可以在编辑器中修改信息直至符合规范。这样既利用了 AI 的创造力,又保证了规范性。

6.4 性能与成本考量

对于频繁提交的开发者,AI 生成每次提交都会消耗 API 调用次数,产生费用。

优化策略

  1. 小步提交,批量生成:养成小步提交的习惯,每次提交的diff范围小,AI 更容易分析准确,提示词消耗的 Token 也更少,成本更低。避免一次性git add .大量无关修改。
  2. 使用更经济的模型:对于提交信息生成,GPT-3.5-turbo 在绝大多数情况下已经足够好用,且成本远低于 GPT-4。确保你的默认配置使用的是经济型模型。
  3. 本地模型替代:如果对成本极其敏感或网络环境苛刻,可以探索是否支持接入本地部署的开源大模型(如通过 LocalAI、Ollama 提供的兼容 OpenAI API 的本地服务)。这需要ai-commit支持自定义 API 端点,或者你自行修改代码适配。这是一个更高级的用法,但可以做到零网络延迟和零 API 费用。
  4. 缓存机制:目前ai-commit似乎没有内置缓存。理论上,对于完全相同的git diff,生成的提交信息应该是相同的。你可以考虑自己实现一个简单的缓存层(例如,对diff内容做 MD5 哈希,将哈希值与生成的提交信息存储在本地文件或数据库中),对于重复的变更直接使用缓存结果,避免重复调用 AI。这需要一定的开发工作量。

经过一段时间的深度使用,我发现ai-commit最大的价值在于它将一种“最佳实践”从可选项变成了默认项。以前需要靠纪律和记忆来维护的提交规范,现在只需要一个简单的命令。它确实会偶尔“犯傻”,生成不太贴切的信息,但在交互确认环节你可以轻松修正。更重要的是,它生成的提交信息结构清晰、要素完整,为后续的自动化 CHANGELOG 生成和版本管理打下了完美的基础。对于个人项目,它是提升专业度的好帮手;对于团队,它是统一提交文化、降低沟通成本的利器。如果你还在为写提交信息而烦恼,不妨花十分钟配置一下,它很可能会成为你 Git 工具箱中最值得的投资之一。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询