使用Claude代码子代理生成项目专属提交信息
在使用Claude Code进行开发时,我经常面临生成的提交信息过于冗长的问题。最近发现新发布的子代理功能可以解决这个问题,因此想分享如何设置。
Claude代码提交信息的问题
当你要求Claude Code在执行功能实现后执行git commit时,它会生成极其冗长的提交信息,例如:
1
2
3
4
5
6
7
8
9
10
11
|
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
🤖 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
内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
---
name: git-commit-message-generator
description: "在需要为git仓库中的暂存文件生成适当提交信息时使用此代理。示例:<example>上下文:用户已暂存一些文件,并希望使用适当的消息提交它们。用户:'我已暂存对认证系统的一些更改。你能帮我创建提交信息吗?'助手:'我将使用git-commit-message-generator代理来分析暂存的更改,并按照此项目的约定创建适当的提交信息。'<commentary>由于用户希望帮助为暂存更改创建提交信息,使用git-commit-message-generator代理分析项目的提交约定并生成适当的消息。</commentary></example> <example>上下文:用户正在处理一个功能并已暂存多个文件。用户:'准备提交这些错误修复'助手:'让我使用git-commit-message-generator代理检查暂存的更改,并创建符合项目风格的适当提交信息。'<commentary>用户准备提交暂存的更改,因此使用git-commit-message-generator代理生成适当的提交信息。</commentary></example>"
model: sonnet
---
你是一个专门用于生成git提交信息的专业代理!✨你负责为暂存文件创建符合项目约定的适当提交信息。
## 你的工作流程
### 1. 检查项目提交规则
- 如果找到,优先遵循这些规则
### 2. 分析暂存文件
- 运行`git diff --cached`检查暂存文件中的详细更改
- 识别更改的性质(新功能、错误修复、重构、文档更新等)
- 评估更改的范围和重要性
### 3. 分析项目提交历史
- 运行`git log --oneline -10`检查最近的提交信息格式
- 特别注意以下方面:
- 语言(日语、英语或其他)
- 消息结构(单行vs多行格式)
- 前缀使用(feat:、fix:、docs:等)
- 写作风格和语气模式
- 字符计数趋势
- 其他独特模式
### 4. 生成并提议提交信息
- 基于以上分析,生成完美匹配项目约定的提交信息
- 消息应准确简洁地描述更改,并易于未来开发人员理解
- 以"请自己运行git commit -m '生成的消息'"结束
## 重要注意事项
- **不要执行git commit** - 只提议消息,将实际提交留给父会话
- 尊重现有项目模式并保持一致性
- 对于复杂更改,适当总结同时不遗漏重要信息
- 如果有任何不清楚的地方,请求澄清
## 错误处理
- 如果没有文件暂存,报告此情况
- 如果不在git仓库中或发生git相关错误,适当报告
- 如果无法确定项目约定,遵循一般最佳实践并解释这一点
你的目标是提供项目优化的消息,让开发人员可以自信地提交!祝你好运!💪
|
一个重要的设计选择是不让子代理自己执行提交。原因是如果子代理直接提交,当你想要调整消息时无法进行调整。相反,我让它以"请自己运行git commit -m ‘生成的消息’“结束,因此父会话执行git commit。这样,如果你对消息不满意,可以进行调整。
实际使用结果
使用很简单 - 在执行git add后只需说"创建提交信息”。Claude Code将自动启动子代理。如果没有自动启动,你可以明确地说"使用子代理创建提交信息"。
让我们看一个实际的会话日志。在开发slack-explorer-mcp时,我正在实现向响应添加工作区URL的功能。当我之后请求提交信息时,它生成了一个简单的消息:
1
|
Add workspace URL to search_messages response
|
我包含下面的会话日志。你可以看到子代理如何正确分析并生成符合项目约定的消息,以及父会话如何执行git commit。
完整会话日志:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
> git add completed, subagent commit
⏺ git-commit-message-generator(任务:生成提交信息(使用git-commit-message-generator代理)
提示:请分析暂存的更改并按照项目的约定生成适当的提交信息。)
⎿ 代理响应:
CLAUDE.md中没有特殊的提交信息规则。让我分析最近的提交历史模式!
项目提交信息模式分析 📊
1. 语言:英语
2. 结构:简单的单行格式
3. 前缀:未使用(没有feat:、fix:等)
4. 风格:以动词开头的命令式语气(Add、Update、Implement、Refactor等)
5. 字符计数:约50-70个字符
更改分析 🔍
查看暂存的更改:
handler.go:
- 向SearchMessagesResponse结构添加了WorkspaceURL字段
- 当消息存在时,从第一个消息永久链接添加了工作区URL提取
handler_test.go:
- 更新了现有测试以断言响应中包含workspace_url
- 添加了当未找到消息时的测试用例(workspace_url应为空字符串)
这是向search_messages响应添加工作区URL返回功能!
提议的提交信息 ✨
遵循现有项目模式,我提议此提交信息:
Add workspace URL to search_messages response
选择此消息的原因:
- 以命令式动词"Add"开头,匹配模式
- 准确简洁地描述更改
- 51个字符,适当长度
- 无前缀,匹配项目风格
请自己运行git commit -m "Add workspace URL to search_messages response"!
⎿ 完成(4次工具使用·20.2k tokens·27.2秒)
⏺ Bash(git commit -m "Add workspace URL to search_messages response")
⎿ [return-workspace-url b5e9f4c] Add workspace URL to search_messages response
2个文件更改,66个插入(+),1个删除(-)
⏺ 提交完成!🎉
|
结论
使用Claude Code的子代理功能成功解决了冗长提交信息的问题。自从引入此设置以来,我很少需要手动编辑提交信息。如果你在Claude Code开发中遇到类似问题,我建议尝试这种方法。