使用 PowerShell 和大模型打造中文 Git 自动提交命令

使用 PowerShell 读取 Git 变更,调用大模型生成中文 Conventional Commit 信息,并通过 git-ec 命令自动完成提交。

在日常开发中,编写规范的 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" %*

它主要完成三件事:

  1. 调用真正的 PowerShell 脚本。
  2. 避免本机 PowerShell 执行策略阻止脚本运行。
  3. -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 自动提交工具`