在日常开发中,编写规范的 Git 提交信息是一件简单但重复的工作。
为了减少这部分操作,我制作了一个名为 git-ec 的本地命令。它可以自动读取 Git 变更、调用大模型生成中文 Conventional Commit 信息,并完成代码提交。
生成效果如下:
feat: 新增提示词设计文档
fix(auth): 修复登录状态失效问题
docs: 补充项目部署说明
文件位置
git-ec 由两个文件组成:
C:\Users\raikay\AppData\Local\Programs\GitEasyCommit\git-ec.cmd
C:\Users\raikay\AppData\Local\Programs\GitEasyCommit\git-ec.ps1
其中:
git-ec.cmd是命令入口。git-ec.ps1包含完整的 Git 检查、模型调用和提交逻辑。
API 配置保存在:
C:\Users\raikay\AppData\Local\GitEasyCommit\config.json
首次配置
首次使用前,需要配置模型的 API Key:
git-ec -Configure
命令会隐藏输入内容,并使用 Windows 当前用户加密机制保存密钥。
配置文件中的密钥不是明文。其他 Windows 用户或其他计算机无法直接解密。
基本用法
自动生成提交信息并直接提交:
git-ec
生成信息后等待人工确认:
git-ec -c
如果使用 -c,命令会显示生成的提交信息和文件统计:
Commit message:
------------------------
docs: 补充提示词使用说明
------------------------
content/posts/blog/prompt.md | 486 ++++++++++++++++++++
确认无误后输入 y 即可提交。
工作原理
整个命令主要分为以下几个阶段。
1. 检查 Git 仓库
脚本首先执行:
git rev-parse --is-inside-work-tree
如果当前目录不属于 Git 仓库,命令会立即停止。
随后通过下面的命令读取文件状态:
git status --short
如果没有任何改动,则输出:
Nothing to commit.
2. 暂存代码变更
脚本首先检查是否已经存在暂存内容:
git diff --cached --name-only
如果暂存区为空,则执行:
git add --all
如果暂存区已经包含文件,则只处理现有的暂存内容,避免把其他未暂存修改意外加入当前提交。
3. 检查提交内容
提交前会运行:
git diff --cached --check
该命令可以发现多余的行尾空格等常见格式问题。
脚本还会检查文件名中是否包含以下敏感特征:
.env
.pem
.p12
.pfx
.key
id_rsa
credentials
secrets
检测到疑似敏感文件时,默认模式会停止提交,避免密钥被意外写入 Git 历史。
此时必须使用确认模式:
git-ec -c
确认文件确实可以提交后再继续。
4. 获取 Git Diff
脚本通过下面的命令读取暂存区差异:
git diff --cached --no-ext-diff --unified=3
这些差异会作为上下文发送给大模型。
为了防止大型修改产生过多 Token,脚本最多发送约 60000 个字符。超过限制的部分会被截断。
5. 生成中文提交信息
脚本调用 OpenAI 兼容接口:
https://maas-api.cn-huabei-1.xf-yun.com/v2/chat/completions
当前使用的模型为:
xop35qwen2b
系统提示词要求模型遵循以下规则:
- 使用 Conventional Commit 格式。
- 类型使用英文。
- 标题和正文使用简体中文。
- 标题不超过 72 个字符。
- 标题结尾不加句号。
- 仅在必要时生成正文。
- 不输出解释或 Markdown 代码块。
- 不复述密钥等敏感内容。
允许的提交类型包括:
| 类型 | 用途 |
|---|---|
feat |
新增功能 |
fix |
修复问题 |
refactor |
代码重构 |
docs |
文档修改 |
test |
测试相关 |
build |
构建系统 |
ci |
持续集成 |
chore |
日常维护 |
perf |
性能优化 |
style |
代码格式 |
revert |
撤销提交 |
6. 解决 Windows 中文乱码
Windows PowerShell 5.1 在处理没有明确字符集的 HTTP 响应时,可能会使用系统默认编码解析内容。
UTF-8 中文可能因此变成:
feat: æ°å¢é¢...
为避免这个问题,脚本不直接依赖 Invoke-RestMethod 自动解析响应,而是读取 HTTP 响应的原始字节:
$responseBytes = $httpResponse.Content
.ReadAsByteArrayAsync()
.GetAwaiter()
.GetResult()
然后强制使用 UTF-8 解码:
$responseText = [Text.Encoding]::UTF8.GetString($responseBytes)
脚本同时设置终端输出编码:
[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
$OutputEncoding = [Text.UTF8Encoding]::new($false)
这样可以同时解决 HTTP 响应解析和终端显示两个环节的中文乱码问题。
7. 创建 Git 提交
模型返回提交信息后,脚本先将内容写入临时文件,然后执行:
git commit --file <临时文件>
使用临时文件而不是直接执行 git commit -m,可以更可靠地处理中文、多行正文和特殊字符。
提交完成后,临时文件会被删除,并输出最新提交:
git log -1 --oneline
CMD 入口的作用
git-ec.cmd 内容非常简单:
@echo off
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%~dp0git-ec.ps1" %*
它主要完成三件事:
- 调用真正的 PowerShell 脚本。
- 避免本机 PowerShell 执行策略阻止脚本运行。
- 将
-c、-Configure等参数继续传递给脚本。
安装目录被加入用户 PATH 后,就可以在任意 Git 仓库中直接执行:
git-ec
注意事项
git-ec 默认会直接提交,因此使用前应注意:
- 检查当前所在的 Git 仓库。
- 确认暂存区中没有其他任务的代码。
- 不要提交
.env、私钥或访问令牌。 - 大规模修改建议使用
git-ec -c人工确认。 - 该命令只创建本地提交,不会自动执行
git push。
总结
git-ec 将原本分散的 Git 操作组合成了一个完整流程:
检查变更
→ 暂存文件
→ 检查差异
→ 调用大模型
→ 生成中文提交信息
→ 创建本地提交
对于高频提交场景,这种方式既能减少重复操作,也能让 Git 历史保持统一、清晰和易读。
推荐标题:
**使用 PowerShell 和大模型打造中文 Git 自动提交命令**
备选标题:
- `git-ec:一条命令自动生成中文 Commit 并提交`
- `用大模型自动生成中文 Conventional Commit`
- `PowerShell 实战:实现 AI 驱动的 Git 自动提交工具`