我把 AI 变成了 “代码秘书”:每次 Git 提交,让它自动写提交信息!
告别 “update”、“fix bug” 的提交噩梦!这套自动化方案,让你的仓库日志像技术文档一样专业
告别 “update”、“fix bug” 的提交噩梦!这套自动化方案,让你的仓库日志像技术文档一样专业
一、 开篇:每个程序员都犯过的 “提交信息恐惧症”
深夜 11 点,你终于修完了一个诡异的 Bug。长舒一口气,回到终端,准备提交代码。光标在提交信息那一栏闪烁,你的大脑却一片空白。
“改了什么来着?”“算了,就写个‘fix bug’吧。”“不行,太敷衍了…… 那写‘修复了某个问题’?”“还是不行……”
最后,你敲下了第 1001 个毫无意义的提交信息:“update”。
第二天,团队 Review 代码历史,看到满屏的 “update”、“fix”、“优化”,没人知道这些提交到底干了什么。半年后,你自己回看,也完全想不起当时为什么要改那行代码。
这就是 “提交信息恐惧症”—— 我们不是不想写好的提交信息,而是在高强度开发中,大脑真的会 “短路”。
但今天,我要告诉你,这个时代已经结束了。你不再需要为写提交信息而纠结,因为你可以把这个任务完全外包给 AI。我将手把手教你搭建一个 “AI 代码秘书”,它会在你每次git commit时,自动分析你的代码变更,并生成清晰、规范、可直接使用的提交信息。
二、 核心方案:让 AI 成为你的 “Git 提交管家”
原理揭秘:钩子(Hook)+ AI 的完美联动
这个方案的核心技术是 Git Hook(钩子)。Git 允许你在特定的重要动作(如提交、推送)发生时,触发自定义脚本。
我们的工作流如下:
- 你:像往常一样修改代码,执行
git add .和git commit(甚至不用写 - m 信息)。 - Git Hook:被触发,自动将本次提交的所有代码差异(diff)收集起来。
- AI 模型:接收这些差异,分析变更内容、意图和影响。
- AI:生成一条符合约定式提交规范的专业信息。
- 系统:自动用这条信息完成提交。
整个过程,你无需任何额外操作,提交历史却从此变得清晰、专业、可追溯。
工具选型:全免费、零成本的黄金组合
放心,这套方案不需要你花一分钱:
-
AI 引擎:DeepSeek(深度求索)
- 完全免费,无需 API 密钥(使用官方免费接口)。
- 代码理解能力强,特别擅长分析 diff。
- 响应速度快,适合本地自动化场景。
-
脚本语言:Python 3
- 系统自带或轻松安装。
- 丰富的网络请求和文本处理库。
-
版本控制:Git
- 你已经在用了。
三、 手把手实战:30 分钟搭建你的 “AI 提交秘书”
环境准备
确保你的电脑有:
- Git(任何版本)
- Python 3.6+
- 网络连接(用于调用 AI 接口)
第一步:创建 Git Hook 脚本
在你的 Git 项目根目录下,找到 .git/hooks/ 文件夹。里面有很多示例文件(以.sample结尾)。我们需要创建 / 修改 prepare-commit-msg 这个钩子。
创建脚本:
# 进入你的项目目录
cd /path/to/your/project
# 创建钩子脚本(如果不存在的话)
cat > .git/hooks/prepare-commit-msg << 'EOF'
#!/bin/bash
# 获取临时提交信息文件路径
COMMIT_MSG_FILE=$1
# 获取当前的提交信息(如果有的话,比如从-m参数传入的)
CURRENT_MSG=$(cat "$COMMIT_MSG_FILE")
# 如果已经有一个非空的提交信息,则跳过AI生成(尊重手动输入)
if [ -n "$CURRENT_MSG" ] && [ "$CURRENT_MSG" != "" ]; then
exit 0
fi
# 获取暂存区的代码差异
DIFF=$(git diff --cached --no-color)
# 如果没有差异,则退出
if [ -z "$DIFF" ]; then
echo "No staged changes found."
exit 0
fi
# 调用Python脚本生成提交信息
AI_MSG=$(python3 /path/to/your/ai_commit_helper.py "$DIFF")
# 如果AI成功生成了信息,则写入提交信息文件
if [ -n "$AI_MSG" ]; then
echo "$AI_MSG" > "$COMMIT_MSG_FILE"
echo "✅ AI已自动生成提交信息:"
echo "📝 $AI_MSG"
else
echo "⚠️ AI未能生成提交信息,请手动填写。"
fi
EOF
# 给脚本执行权限
chmod +x .git/hooks/prepare-commit-msg
第二步:编写 AI 生成脚本(核心)
创建一个独立的 Python 脚本,例如放在你的家目录下:~/ai_commit_helper.py
#!/usr/bin/env python3
"""
AI提交信息生成助手
使用DeepSeek免费API自动生成Git提交信息
"""
import sys
import requests
import json
import re
def call_deepseek_api(code_diff):
"""
调用DeepSeek API分析代码差异并生成提交信息
"""
# DeepSeek免费API端点(请使用时确认最新地址)
api_url = "https://api.deepseek.com/chat/completions"
# 构建一个专业的提示词(Prompt)
prompt = f"""你是一个资深的软件开发工程师,擅长编写清晰、规范的Git提交信息。
请根据以下Git代码差异(diff),生成一条专业的提交信息。
要求:
1. 使用**约定式提交**格式:<类型>[可选 范围]: <描述>
- 常用类型:feat(新功能)、fix(修复bug)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(构建/工具)
2. 描述语言使用中文,简洁明了,说清楚“做了什么”以及“为什么做”(如果能从diff中推断出来)。
3. 如果改动复杂,可以在提交信息正文中简要列出关键点。
4. 避免使用“更新”、“修改”等模糊词汇。
代码差异如下:
{code_diff}
请只返回最终的提交信息文本,不要有其他解释。"""
# 准备请求数据
payload = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个专业的Git提交信息生成助手。"},
{"role": "user", "content": prompt}
],
"temperature": 0.3, # 较低的温度,让输出更稳定
"max_tokens": 500
}
headers = {
"Content-Type": "application/json",
# 注意:DeepSeek可能需要授权,请参考其最新官方文档
# "Authorization": "Bearer your_free_token_here"
# 目前其Web版免费,API政策可能有变化,如需要token请注册获取
}
try:
# 发送请求(这里使用requests,如果是付费API需要添加auth)
# 由于API政策可能变化,这里提供两种方式:
# 方式1:如果官方提供免费API接口
response = requests.post(api_url, json=payload, headers=headers, timeout=10)
# 方式2:如果更简单点,可以用国内可访问的开放模型,如通过第三方中转(需自行寻找稳定服务)
# 这里以假设的免费端点为例,实际使用时请替换为可用的稳定服务
if response.status_code == 200:
result = response.json()
commit_msg = result['choices'][0]['message']['content'].strip()
# 清理可能的多余标记
commit_msg = re.sub(r'^```[a-z]*\n', '', commit_msg)
commit_msg = re.sub(r'\n```$', '', commit_msg)
return commit_msg
else:
print(f"API请求失败: {response.status_code}", file=sys.stderr)
return None
except Exception as e:
print(f"调用AI接口时出错: {e}", file=sys.stderr)
return None
def simple_fallback(diff):
"""
简单的备选方案:如果AI调用失败,生成基础信息
"""
lines = diff.split('\n')
# 统计变更类型
added_files = set()
modified_files = set()
for line in lines:
if line.startswith('+++ b/'):
filepath = line[6:]
modified_files.add(filepath)
elif line.startswith('--- /dev/null'):
# 新文件在后续会有 +++ b/ 行
pass
elif line.startswith('diff --git'):
parts = line.split(' ')
if len(parts) >= 3:
filepath = parts[2][2:] # 去掉 "a/"
if filepath not in modified_files:
modified_files.add(filepath)
# 简单判断提交类型
file_count = len(modified_files)
if file_count == 0:
return "chore: 无实际代码变更"
# 检查是否是文档更新
doc_exts = ['.md', '.txt', '.rst', '.tex']
if any(f.endswith(tuple(doc_exts)) for f in modified_files):
return f"docs: 更新文档 ({', '.join(list(modified_files)[:2])}...)"
return f"fix: 修复问题涉及{file_count}个文件"
def main():
if len(sys.argv) < 2:
print("请提供git diff内容作为参数", file=sys.stderr)
sys.exit(1)
code_diff = sys.argv[1]
if not code_diff or len(code_diff.strip()) < 10:
print("代码差异过小,无需AI生成", file=sys.stderr)
sys.exit(0)
# 尝试调用AI生成
commit_msg = call_deepseek_api(code_diff)
# 如果AI生成失败,使用备选方案
if not commit_msg:
commit_msg = simple_fallback(code_diff)
print(commit_msg)
if __name__ == "__main__":
main()
重要提示:由于 AI API 服务可能变化,脚本中提供了灵活的架构。DeepSeek 的 API 政策请以其官网为准。你也可以轻松替换为其他你熟悉的免费 AI 服务。
第三步:配置与测试
-
修改脚本路径:将第一步中 Python 脚本的路径(
/path/to/your/ai_commit_helper.py)替换为实际的路径。 -
进行第一次测试:
# 1. 修改一些代码
echo "// 添加新功能" >> src/main.js
# 2. 添加到暂存区
git add src/main.js
# 3. 提交(不要使用-m参数!)
git commit
此时,钩子脚本会自动运行。你会看到类似这样的输出:
✅ AI已自动生成提交信息:
📝 feat(main): 添加新功能模块入口
- 创建main.js作为应用主入口文件
- 添加基础注释结构
- 查看提交历史验证:
git log --oneline -3
你应该看到一条规范的提交信息,而不是 "update"!
四、 进阶优化:让你的 “AI 秘书” 更聪明
1. 支持多仓库的全局配置
如果你希望所有 Git 项目都使用这个功能,可以设置全局 Git 模板:
# 创建全局git模板目录
mkdir -p ~/.git-templates/hooks
# 将我们的钩子脚本复制到全局模板
cp .git/hooks/prepare-commit-msg ~/.git-templates/hooks/
# 配置Git使用这个模板
git config --global init.templatedir '~/.git-templates'
# 已有项目需要重新初始化钩子
cd /path/to/your/existing-project
rm -rf .git/hooks
git init # 这会在现有仓库中重新初始化钩子
2. 添加提交信息确认环节
如果你希望对 AI 生成的信息有最终控制权,可以修改钩子脚本,在提交前让你确认或编辑:
# 在原有脚本的AI生成后,加入以下逻辑
echo "AI生成的提交信息:"
echo "$AI_MSG"
echo ""
read -p "是否使用此信息?(y/n/e) [y]: " CONFIRM
case $CONFIRM in
[nN]* )
echo "请手动编辑提交信息。"
exit 1
;;
[eE]* )
echo "$AI_MSG" > "$COMMIT_MSG_FILE"
# 让用户编辑
${EDITOR:-vi} "$COMMIT_MSG_FILE"
;;
* )
echo "$AI_MSG" > "$COMMIT_MSG_FILE"
;;
esac
3. 集成更多 AI 模型
你可以轻松扩展脚本,支持多个 AI 服务作为备选:
def generate_commit_message(diff):
# 尝试DeepSeek
msg = call_deepseek(diff)
if msg:
return msg
# 尝试Moonshot(另一个国内优秀模型)
msg = call_moonshot(diff)
if msg:
return msg
# 最后回退到简单规则
return simple_fallback(diff)
五、 效果对比:从 “垃圾日志” 到 “技术文档”
改造前 vs 改造后
| 场景 | 改造前(人工) | 改造后(AI 生成) |
|---|---|---|
| 修复登录 Bug | fix bug |
fix(auth): 修复登录时验证码不刷新问题 |
| 添加新功能 | update |
feat(user): 添加用户个人资料编辑功能 |
| 更新文档 | 修改文档 |
docs(api): 更新用户认证接口文档,添加示例 |
| 代码重构 | 优化代码 |
refactor(utils): 重构日期处理函数,提高时区兼容性 |
实际项目中的价值
- 新人入职:通过清晰的提交历史,新人能快速理解代码演进脉络。
- 故障排查:当生产环境出问题时,能精准定位到具体引入问题的提交。
- 生成变更日志:规范的提交信息可以自动生成专业的更新日志(CHANGELOG)。
- 代码审查:Review 时一目了然,知道每个提交的意图。
六、 常见问题与解决方案
Q1:AI 生成的提交信息不准确怎么办?
A:这是学习过程。AI 会根据你的代码风格不断优化。你可以:
- 在提示词中指定你团队的具体规范
- 设置确认环节,人工微调
- 对于不满意的生成,手动重写,系统会学习你的偏好
Q2:代码差异很大时,AI 能处理吗?
A:可以,但超大 diff(超过 4000 行)可能需要分割。我们的脚本已经做了优化,会提取关键变更进行分析。
Q3:这个方案安全吗?我的代码会被上传吗?
A:如果你使用本地模型或可信的 API,代码只会被发送到你选择的 AI 服务。对于敏感项目,你可以:
- 使用本地部署的开源模型(如 Qwen、CodeLlama)
- 仅对开源项目使用此功能
- 配置脚本过滤敏感文件路径
Q4:团队其他成员也需要配置吗?
A:不一定。这是本地钩子,只影响你自己的提交。但建议团队统一采用,可以共享配置脚本。
七、 立即开始,让你的提交历史焕然一新
今日行动清单
- 5 分钟体验:在个人小项目上尝试基础版本,感受 AI 生成的效果。
- 30 分钟部署:按照教程,在你的主力项目上完整配置。
- 1 小时分享:将你的配置和经验写成团队 Wiki,帮助队友一起提升。
- 持续优化:根据实际使用反馈,调整提示词和生成逻辑。
高级玩家挑战
如果你已经熟练掌握基础版本,可以尝试这些增强功能:
- 自动关联 Issue 编号:让 AI 在提交信息中自动关联 JIRA 或 GitHub Issue。
- 多语言支持:根据项目配置,生成中英文双语的提交信息。
- 代码质量检查:在提交前,让 AI 顺便检查代码风格和潜在 Bug。
- 智能分支命名:根据提交内容,建议更有意义的分支名称。
结语:好的习惯,应该由工具养成
我们常说 “要写规范的提交信息”,但在紧张的开发节奏中,这往往是最先被牺牲的 “好习惯”。与其依赖不可靠的自律,不如让工具帮我们养成习惯。
这套 “AI 提交秘书” 方案,不仅仅是一个效率工具,它更是一种工程思维的升级:将重复、低价值的思考工作委托给 AI,让人专注于真正需要创造力的部分。
从今天起,让你的每一次提交都言之有物,让你的代码仓库成为团队的知识宝库,而不是一堆杂乱无章的 “时间戳堆砌”。
最好的提交历史,是你几乎忘了它的存在,但它始终在那里,清晰、准确、随时待命 —— 就像最好的助手一样。
更多推荐



所有评论(0)