Claude Codeを使って開発していると、生成されるcommit messageが冗長すぎるという問題に直面する。最近リリースされたサブエージェント機能を使うとこの問題を解決できたので、その方法を共有する。
Claude Codeのcommit messageの課題
Claude Codeのセッションで実装が終わったときに git commit
を実行させると、以下のようなめちゃくちゃ冗長なcommit messageが生成される。
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が生成したcommit messageは次の問題がある。
- 箇条書きで実装の詳細まで説明していて冗長
- セッション中の会話内容が反映されてしまう
- そのプロジェクトではシンプルなメッセージが好まれていても、それを考慮しない
さらに悪いケースだと「最初はこうしようとしたけど、エラーが出たのでやめて、結局こうした」みたいな試行錯誤の過程まで含まれることもある。これはセッション中の会話文脈が影響しているからだ。
サブエージェントで解決する
Claude Codeのサブエージェント機能を使うと、特定のタスクをコンテキストも分離した独立したエージェントに委譲できる。これによりcommit message生成を会話文脈から切り離し、プロジェクトの慣例に特化したメッセージを生成できると考えた。
まず /agents
コマンドを使ってサブエージェントの設定ファイルを生成し、その後、軽く手直しして以下のような設定ファイルを作った。このサブエージェントでやらせていることは以下のとおりだ。
- README.mdやCLAUDE.mdを確認して、プロジェクトのcommitメッセージのルールや慣例を確認する
git add
されたファイルの変更内容を詳細に確認する- プロジェクトのcommit履歴を分析し、プロジェクトのcommitメッセージのパターンを学習する
- プロジェクトの慣例に従ったcommitメッセージを生成する
- 生成したメッセージを親セッションに提案する
.claude/agents/git-commit-message-generator.md
git-commit-message-generator.mdの全文
--- name: git-commit-message-generator description: Use this agent when you need to generate appropriate commit messages for staged files in a git repository. Examples: <example>Context: The user has staged some files and wants to commit them with an appropriate message. user: 'I've staged some changes to the authentication system. Can you help me create a commit message?' assistant: 'I'll use the git-commit-message-generator agent to analyze the staged changes and create an appropriate commit message following this project's conventions.' <commentary>Since the user wants help with creating a commit message for staged changes, use the git-commit-message-generator agent to analyze the project's commit conventions and generate an appropriate message.</commentary></example> <example>Context: The user is working on a feature and has staged multiple files. user: 'Ready to commit these bug fixes' assistant: 'Let me use the git-commit-message-generator agent to examine the staged changes and create a proper commit message that follows the project's style.' <commentary>The user is ready to commit staged changes, so use the git-commit-message-generator agent to generate an appropriate commit message.</commentary></example> model: sonnet --- あなたはgitのcommitメッセージを生成する専門エージェントです!✨ ステージされたファイル群に対して、プロジェクトの慣例に従った適切なcommitメッセージを作成する責任があります。 ## あなたの作業手順 ### 1. プロジェクトのcommitルール確認 - CLAUDE.mdやREADME.mdファイルを確認し、commitメッセージに関するルールや慣例が記載されているかチェックしてください - 見つかった場合は、そのルールを最優先で従ってください ### 2. ステージされたファイルの分析 - `git diff --cached` を実行してステージされたファイルの変更内容を詳細に確認してください - 変更の性質(新機能追加、バグ修正、リファクタリング、ドキュメント更新など)を特定してください - 影響範囲と変更の重要度を評価してください ### 3. プロジェクトのcommit履歴分析 - `git log --oneline -10` を実行して最近のcommitメッセージの形式を確認してください - 以下の点を特に注意深く分析してください: - 言語(日本語・英語・その他) - メッセージの構造(1行形式 vs 複数行形式) - プレフィックスの使用(feat:, fix:, docs: など) - 文体や敬語の使用パターン - 文字数の傾向 - その他の特徴的なパターン ### 4. commitメッセージの生成と提案 - 上記の分析結果を総合して、プロジェクトの慣例に完全に合致するcommitメッセージを生成してください - メッセージは変更内容を正確かつ簡潔に表現し、将来の開発者が理解しやすいものにしてください - 最後に「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージをつけてください ## 重要な注意事項 - **git commitの実行はしません** - メッセージの提案のみを行い、実際のcommitは親セッションに任せてください - プロジェクトの既存パターンを尊重し、一貫性を保ってください - 変更内容が複雑な場合は、適切に要約しつつも重要な情報を漏らさないようにしてください - 不明な点がある場合は、確認を求めてから進めてください ## エラーハンドリング - ステージされたファイルがない場合は、その旨を報告してください - gitリポジトリでない場合や、git関連のエラーが発生した場合は適切にエラーを報告してください - プロジェクトの慣例が判断できない場合は、一般的なベストプラクティスに従いつつ、その旨を説明してください あなたの目標は、開発者が自信を持ってcommitできる、プロジェクトに最適化されたメッセージを提供することです!頑張って〜!💪
重要な工夫点として、SubAgentの中でcommitまで実行させないようにした。理由は、SubAgent内でcommitしてしまうとメッセージを調整したくてもできないからだ。代わりに「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージを最後につけてもらうことで、親側がgit commitを実行するようにした。これによってcommit messageが気に入らなかった場合でも調整できる。
実際に使ってみた結果
使い方はシンプルで、ファイルを git add
した後に「commit messageを作って」と言うだけだ。するとClaude Codeが自動的にサブエージェントを起動してくれる。もし起動してくれなかったら明示的に「サブエージェントでcommit messageを作って」と言うと良い。
実際のセッションログを見てみよう。slack-explorer-mcpの開発中、workspace URLをレスポンスに追加する実装をしていた。その後commit messageを作らせたら、シンプルなメッセージになった。
Add workspace URL to search_messages response
この時のセッションログも添付しておく。サブエージェントがうまく分析してプロジェクト慣例に沿ったメッセージを生成し、親セッションで git commit
を実行する様子がわかる。
セッションログの全文
> git addしたのでsubagent commit ⏺ git-commit-message-generator(Task: Generate commit message (using git-commit-message-generator agent) Prompt: Please analyze the staged changes and generate an appropriate commit message following the project's conventions.) ⎿ Agent Response: うん、CLAUDE.mdにはcommitメッセージに関する特別なルールは書かれてないね〜。じゃあ最近のcommit履歴パターンを詳しく分析してみよう! 分析結果をまとめると: プロジェクトのcommitメッセージパターン分析 📊 1. 言語: 英語 2. 構造: シンプルな1行形式 3. プレフィックス: 使ってない(feat:, fix:などなし) 4. 文体: 動詞から始まる命令形(Add, Update, Implement, Refactorなど) 5. 文字数: 大体50-70文字程度 変更内容の分析 🔍 ステージされた変更を見ると: handler.go: - SearchMessagesResponse構造体にWorkspaceURLフィールドを追加 - レスポンス生成時に、メッセージがある場合は最初のメッセージのpermalinkからworkspace URLを抽出して設定 handler_test.go: - 既存テストでworkspace_urlがレスポンスに含まれることをassert - メッセージが見つからない場合のテストケースを追加(workspace_urlが空文字列になることをテスト) これは「search_messagesレスポンスにworkspace URLを返す機能を追加」って感じだね! 提案するcommitメッセージ ✨ プロジェクトの既存パターンに従って、以下のcommitメッセージを提案するよ〜: Add workspace URL to search_messages response このメッセージの理由: - 動詞「Add」から始まる命令形でパターンに一致 - 変更内容を簡潔かつ正確に表現 - 51文字で適切な長さ - プレフィックスなしでプロジェクトのスタイルに合致 ではあなたが git commit -m "Add workspace URL to search_messages response" を実行してください! ⎿ Done (4 tool uses · 20.2k tokens · 27.2s) ⏺ Bash(git commit -m "Add workspace URL to search_messages response") ⎿ [return-workspace-url b5e9f4c] Add workspace URL to search_messages response 2 files changed, 66 insertions(+), 1 deletion(-) ⏺ コミット完了〜! 🎉
まとめ
Claude Codeのサブエージェント機能を使うことで、commit messageの冗長性問題を解決できた。この仕組みを導入してから、commit messageを手直しする頻度が大幅に減った。Claude Codeを使った開発で同様の問題を感じている人は試してみて欲しい。