使用Claude代码子代理生成项目专属提交信息

本文介绍如何利用Claude Code的子代理功能解决自动生成Git提交信息过于冗长的问题。通过创建专门的提交信息生成代理,能够分析项目规范和历史记录,生成符合项目约定的简洁提交信息,提升开发效率。

使用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开发中遇到类似问题,我建议尝试这种方法。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计