使用Claude代码子代理生成项目特定提交消息
在使用Claude Code进行开发时,我经常面临生成的提交消息过于冗长的问题。最近发现新发布的子代理功能可以解决这个问题,因此想分享如何设置。
Claude代码提交消息的问题
当你要求Claude Code在执行功能实现后运行git commit时,它会生成极其冗长的提交消息,例如:
Add describe_tables e2e test and refactor MCP initialization- Add comprehensive e2e test for describe_tables tool
- Refactor MCP server initialization into reusable functions- setupMCPServer: Starts the server process- initializeMCPServer: Handles the MCP protocol handshake
- Ensure both list_tables and describe_tables have complete e2e coverage:robot: Generated with [Claude Code](https://claude.ai/code)Co-Authored-By: Claude <noreply@anthropic.com>
Claude Code生成的提交消息存在几个问题:
- 在项目符号中包含过多的实现细节
- 反映会话中的对话上下文
- 不考虑项目偏好的简单消息风格
在更糟的情况下,它们甚至包括试错过程,如"最初尝试了这种方法,但出现错误,因此放弃并最终做了这个替代方案"。这是因为会话的对话上下文影响了消息生成。
使用子代理解决问题
Claude Code的子代理功能允许你将特定任务委托给具有独立上下文的独立代理。我认为这可以将提交消息生成与会话上下文隔离开来,并创建符合项目约定的消息。
首先,我使用/agents
命令生成子代理配置文件,然后进行一些调整创建以下设置。这个子代理的功能包括:
- 分析git添加文件中的详细更改
- 研究项目的提交历史以学习消息模式
- 生成符合项目约定的提交消息
- 将生成的消息提议给父会话
完整的.claude/agents/git-commit-message-generator.md
内容:
你是专门用于生成git提交消息的代理!:sparkles:你负责为暂存文件创建符合项目约定的适当提交消息。## 工作流程### 1. 检查项目提交规则- 如果找到,优先遵循这些规则### 2. 分析暂存文件
- 运行`git diff --cached`检查暂存文件中的详细更改
- 识别更改性质(新功能、错误修复、重构、文档更新等)
- 评估更改的范围和重要性### 3. 分析项目提交历史
- 运行`git log --oneline -10`检查最近提交消息格式
- 特别注意以下方面:- 语言(日语、英语或其他)- 消息结构(单行vs多行格式)- 前缀使用(feat:、fix:、docs:等)- 写作风格和语气模式- 字符数趋势- 其他显著模式### 4. 生成并提议提交消息
- 基于以上分析,生成完美匹配项目约定的提交消息
- 消息应准确简洁地描述更改,便于未来开发人员理解
- 以"请自行运行git commit -m '生成的消息'"结束## 重要说明- **不要执行git commit** - 仅提议消息,将实际提交留给父会话
- 尊重现有项目模式并保持一致性
- 对于复杂更改,适当总结同时不遗漏重要信息
- 如果有任何不清楚的地方,请要求澄清## 错误处理- 如果没有文件暂存,报告此情况
- 如果不在git仓库中或发生git相关错误,适当报告
- 如果无法确定项目约定,遵循一般最佳实践并解释你的目标是提供项目优化的消息,让开发人员可以自信地提交!祝你好运!:flexed_biceps:
一个重要的设计选择是不让子代理自己执行提交。原因是如果子代理直接提交,当你想要调整消息时无法调整。相反,我让它以"请自行运行git commit -m '生成的消息'"结束,因此父会话执行git commit。这样如果对消息不满意,可以进行调整。
实际使用结果
使用很简单 - 在执行git add后只需说"创建提交消息"。Claude Code将自动启动子代理。如果没有自动启动,可以明确说"使用子代理创建提交消息"。
让我们看一个实际会话日志。在开发slack-explorer-mcp时,我正在实现向响应添加工作区URL的功能。当我随后要求提交消息时,它生成了一个简单的消息:
Add workspace URL to search_messages response
我包含下面的会话日志。你可以看到子代理如何正确分析并生成符合项目约定的消息,以及父会话如何执行git commit。
完整会话日志:
> git add completed, subagent commit:record_button: git-commit-message-generator(任务:生成提交消息(使用git-commit-message-generator代理)提示:请分析暂存更改并生成符合项目约定的适当提交消息。)⎿ 代理响应:CLAUDE.md中没有特殊提交消息规则。让我分析最近提交历史模式!项目提交消息模式分析 :bar_chart:1. 语言:英语2. 结构:简单单行格式3. 前缀:未使用(无feat:、fix:等)4. 风格:以动词开头的命令式语气(Add、Update、Implement、Refactor等)5. 字符数:约50-70个字符更改分析 :magnifying_glass_tilted_left:查看暂存更改:handler.go:- 向SearchMessagesResponse结构添加WorkspaceURL字段- 当消息存在时,从第一条消息永久链接添加工作区URL提取handler_test.go:- 更新现有测试以断言响应中包含workspace_url- 添加未找到消息的测试用例(workspace_url应为空字符串)这是向search_messages响应添加工作区URL返回功能!提议的提交消息 :sparkles:遵循现有项目模式,我提议此提交消息:Add workspace URL to search_messages response选择此消息的原因:- 以命令式动词"Add"开头,匹配模式- 准确简洁地描述更改- 51个字符,适当长度- 无前缀,匹配项目风格请自行运行git commit -m "Add workspace URL to search_messages response"!⎿ 完成(4个工具使用·20.2k令牌·27.2秒):record_button: Bash(git commit -m "Add workspace URL to search_messages response")⎿ [return-workspace-url b5e9f4c] Add workspace URL to search_messages response2个文件更改,66个插入(+),1个删除(-):record_button: 提交完成!:party_popper:
结论
使用Claude Code的子代理功能成功解决了冗长提交消息的问题。自从引入此设置后,我很少需要手动编辑提交消息。如果你在Claude Code开发中遇到类似问题,我推荐尝试这种方法。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码