avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 开发一个git cli提交助手
文章

开发一个git cli提交助手

发表于 2026-09-4 更新于 2026-09- 4
作者 mdo
13~17 分钟 阅读

我们可以把这个工具做得更专业、更像一个正规的 CLI 工具。我们可以支持自动读取本地 .env 配置、流式打印响应(看起来更酷炫),并且能够直接通过全局命令或 git m 触发。

下面是为您量身定制的完整开发步骤,采用目前性价比最高且完全兼容 OpenAI 格式的 DeepSeek API 作为示例(若使用其他模型,只需替换 BASE_URL 和 MODEL)。


第一步:初始化项目

在本地找一个目录(例如 ~/projects/git-m-cli),初始化并安装必要的依赖。我们不需要复杂的框架,使用 Node.js 原生的 child_process 和官方的 openai SDK 即可。

bash

mkdir git-m-cli && cd git-m-cli
npm init -y
# 安装 OpenAI 官方 SDK(用于兼容调用各种大模型)以及用于读取配置的 dotenv
npm install openai dotenv

请谨慎使用此类代码。

打开 package.json,在根节点添加 "type": "module",以便我们使用现代的 import 语法:

json

{
  "name": "git-m-cli",
  "version": "1.0.0",
  "type": "module",
  ...
}

请谨慎使用此类代码。


第二步:创建配置文件

在项目根目录下创建一个 .env 文件,用来存放你的 API Key 和配置(避免把密钥硬编码在代码里):

env

# 大模型 API 配置(以 DeepSeek 为例,也可以换成 OpenAI/Ollama 等)
AI_API_KEY=你的_DEEPSEEK_API_KEY
AI_BASE_URL=https://deepseek.com
AI_MODEL=deepseek-chat

请谨慎使用此类代码。


第三步:编写核心 CLI 脚本

在项目根目录下创建一个 index.js 文件,写入以下完整代码:

javascript

#!/usr/bin/env node

import { execSync } from 'child_process';
import path from 'path';
import { fileURLToPath } from 'url';
import OpenAI from 'openai';
import dotenv from 'dotenv';

// 1. 加载配置(支持读取脚本所在目录的 .env 文件)
const __dirname = path.dirname(fileURLToPath(import.meta.url));
dotenv.config({ path: path.join(__dirname, '.env') });

const { AI_API_KEY, AI_BASE_URL, AI_MODEL } = process.env;

if (!AI_API_KEY) {
  console.error('❌ 错误: 未在 .env 文件中检测到 AI_API_KEY!');
  process.exit(1);
}

// 初始化 OpenAI 客户端
const openai = new OpenAI({
  apiKey: AI_API_KEY,
  baseURL: AI_BASE_URL || 'https://deepseek.com',
});

async function main() {
  try {
    // 2. 获取暂存区的代码差异 (Diff)
    let diff = '';
    try {
      diff = execSync('git diff --cached').toString().trim();
    } catch (e) {
      console.error('❌ 错误: 当前目录似乎不是一个 Git 仓库。');
      process.exit(1);
    }

    if (!diff) {
      console.log('⚠️ 提示: 没有发现已暂存(Staged)的文件,请先运行 `git add` 暂存你的改动。');
      process.exit(0);
    }

    console.log('🤖 正在分析暂存区代码并生成备注...\n');

    // 3. 构建 Prompt
    const prompt = `你是一个专业的 Git 提交助手。请根据以下代码的 diff 内容,生成一条精炼、准确、结构清晰的 Git commit message。
请严格使用 Angular 规范格式(例如: feat(scope): add something 或 fix: resolve bug)。
不要输出任何解释性文本、不要包裹 markdown 代码块(如 \`\`\`),只输出 commit message 本身。

---
${diff.slice(0, 5000)} 
---`;

    // 4. 调用大模型(开启流式传输,让体验更丝滑)
    const stream = await openai.chat.completions.create({
      model: AI_MODEL || 'deepseek-chat',
      messages: [{ role: 'user', content: prompt }],
      temperature: 0.1, // 降低随机性,使输出更稳定
      stream: true,
    });

    let commitMessage = '';
    process.stdout.write('📝 AI 建议的备注: ');
    
    for await (const chunk of stream) {
      const content = chunk.choices[0]?.delta?.content || '';
      commitMessage += content;
      process.stdout.write(content); // 实时打印生成的字符
    }
    process.stdout.write('\n\n');

    commitMessage = commitMessage.trim();

    if (!commitMessage) {
      console.error('❌ 错误: AI 未能生成有效的备注。');
      process.exit(1);
    }

    // 5. 执行真正的 Git Commit
    console.log('🚀 正在提交到 Git...');
    // 使用带引标的字符串,防止备注中的特殊字符引发终端解析错误
    execSync(`git commit -m "${commitMessage.replace(/"/g, '\\"')}"`, { stdio: 'inherit' });
    console.log('\n✅ 提交成功!');

  } catch (error) {
    console.error('\n❌ 发生异常:', error.message);
    process.exit(1);
  }
}

main();

请谨慎使用此类代码。


第四步:配置 Git 别名与权限

我们要让系统和 Git 认识这个脚本。

  1. 赋予脚本执行权限:

    bash

    chmod +x index.js
    

    请谨慎使用此类代码。

  2. 配置 Git 别名:
    由于 Git 原生不支持
    git -m 这种带横杠的二级参数作为命令(-m 在 git 中默认是 message 的参数标识),最符合直觉的替代方案是配置为 git m。在终端运行以下命令(请将路径替换为你本地 index.js的绝对路径):

    bash

    git config --global alias.m "!node /你的绝对路径/git-m-cli/index.js"
    

    请谨慎使用此类代码。


🎯 体验测试

现在,前往你任何一个开发中的 Git 项目:

bash

# 1. 修改一些代码,然后暂存
git add .

# 2. 见证奇迹的时刻
git m

请谨慎使用此类代码。

控制台将会流式打印出:

text

🤖 正在分析暂存区代码并生成备注...

📝 AI 建议的备注: feat(auth): implement jwt modern token verification

🚀 正在提交到 Git...
[main 7fa3bc2] feat(auth): implement jwt modern token verification
 2 files changed, 45 insertions(+), 5 deletions(-)

✅ 提交成功!

请谨慎使用此类代码。

为了让这个小工具在你的日常开发中更实用,你是否需要增加以下功能:

  • 自动加入检查机制:如果 AI 生成的备注不满意,允许在终端输入 y/n 来决定是否确认提交或重新生成?

  • 自动运行 git add .:连 git add 都不想敲,直接输入 git m 一键暂存并提交所有修改?

  • 更改为其他大模型(如本地部署的 Ollama)?

知识库
许可协议:  CC BY 4.0
分享

相关文章

10月 7, 2026

比尔盖茨的智慧:想多赚钱,就每天循环做这3件事

我们总有一种非常固执的错觉,认为那些站在财富金字塔顶端的人,必然拥有某种超越常人的特异功能。我们在脑海中给比尔盖茨这样的大佬描绘了一幅极其悲壮的奋斗画像。大家总觉得,他之所以能富可敌国,肯定是因为他每天只睡三个小时,同时对着八个电脑屏幕疯狂敲击键盘,每一秒钟都在做出价值几亿美金的生死抉择。 为了模仿

9月 28, 2026

程序员越想创业,越不要急着动手

一个能源方面的前辈找到我,希望通过我把一些人工的工作 AI 自动化。 能源方面我不懂,找 Gemini 聊完发现这个是可以复制的,非常兴奋。我跟老婆说,这个项目做好以后可以做成平台,推广到其他公司,你就等着做总裁夫人吧! 她听完以后跟我说,这个项目还是太定制化,和我之前做的一个项目很像。 那个项目一

9月 25, 2026

忍了一年多,我终于对i18n下手了过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道

前言 大家好,我是奈德丽。 过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),对于重复笨拙的工作非常抵触,于是,我开始思考如何优化团队的多语言管理模式。 痛点背景 先说说我们在机票项目中遇到的

下一篇

Roo Code:AI驱动的企业级开发助手

上一篇

开发 CLI 工具

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。