🪄

Claude CodeのHooksで自動コミット! AIがコミットメッセージも考えてくれるツールを作った

に公開

はじめに

Claude Codeを使って開発していると、「AIが修正してくれたコードを手動でコミットするのが面倒...」と感じたことはありませんか?
CLAUDE.mdに、gitにコミットしてと書いても守ってくれないことが多々あります。

この記事では、Claude Codeのhook機能を活用して、AIによる変更を自動的にGitコミットし、さらにコミットメッセージまでAIが生成してくれるツール「claude-code-auto-commit」を紹介します。

このツールを使うことで、以下のメリットが得られます:

  • Claude Codeの修正内容が自動的にGitに記録される
  • Conventional Commits形式の適切なコミットメッセージが自動生成される
  • オプションで自動的にリモートリポジトリにプッシュも可能
  • 開発履歴の追跡が容易になる

対象読者

  • Claude Codeを使って開発している方
  • Gitのコミット作業を効率化したい方
  • AIツールと開発ワークフローの統合に興味がある方

claude-code-auto-commitとは

claude-code-auto-commitは、Claude Codeのhook機能と連携して動作するPython製のツールです。

Claude Codeが作業を終了したタイミングで自動的に起動し、以下の処理を行います:

  1. 現在のディレクトリがGitリポジトリかチェック
  2. 変更内容があるか確認
  3. 変更内容をGemini CLIでコミットメッセージを生成
  4. 生成されたメッセージで自動的にGitコミット
  5. AUTO_PUSHが有効な場合、自動的にリモートへプッシュ

実際に使ってみた

セットアップ

まず、必要なツールをインストールします:

# リポジトリをクローン
git clone https://github.com/owayo/claude-code-auto-commit.git

Gemini CLIがセットアップされていない場合はGemini CLIをセットアップしてください:
https://zenn.dev/owayo/articles/a9254d5e65641b

次に、Claude Codeの設定ファイル(~/.claude/settings.json)を編集します:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python3 /path/to/claude-code-auto-commit/auto-git-commit.py",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

動作確認

実際にClaude Codeでコードを修正してもらい、Hooksにより呼ばれると、自動的にこんなコミットが作成されます:

feat: ユーザー認証機能の実装

Conventional Commits形式で、変更内容に応じた適切なプレフィックス(feat、fix、refactorなど)が自動的に選ばれます。

カスタマイズ

自動プッシュ機能を有効化

コミット後に自動的にリモートリポジトリにプッシュしたい場合は、CLAUDE_CODE_AUTO_PUSH環境変数を設定します:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "CLAUDE_CODE_AUTO_PUSH=1 python3 /path/to/claude-code-auto-commit/auto-git-commit.py",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

この設定により、コミット後に自動的にgit pushが実行されます。チーム開発や、複数デバイスで作業している場合に特に便利です。

英語でコミットメッセージを生成

英語でコミットメッセージを生成したい場合:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "CLAUDE_CODE_COMMIT_LANGUAGE='English' CLAUDE_CODE_DEFAULT_COMMIT_MESSAGE='chore: auto commit by Claude Code' python3 /path/to/auto-git-commit.py",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

デフォルトメッセージの変更

Gemini CLIが失敗した場合のデフォルトメッセージも変更できます:

"command": "CLAUDE_CODE_DEFAULT_COMMIT_MESSAGE='chore: 自動修正' python3 /path/to/auto-git-commit.py"

組み合わせる場合

日本語でコミットメッセージを生成し、自動プッシュも有効にする場合:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "CLAUDE_CODE_AUTO_PUSH=1 CLAUDE_CODE_COMMIT_LANGUAGE='日本語' python3 /path/to/claude-code-auto-commit/auto-git-commit.py",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

実装の工夫

タイムアウト処理

大きな変更がある場合、Gemini CLIの処理に時間がかかることがあります。そこで、以下の対策を実装しました:

# Geminiコマンドに20秒のタイムアウトを設定
result = subprocess.run(
    ['gemini', '-p', prompt],
    capture_output=True,
    text=True,
    timeout=20
)

変更内容のサイズ制限

巨大な差分でGemini CLIがエラーになるのを防ぐため、変更内容を5000文字に制限:

# 差分の詳細を取得(最大5000文字)
diff_output = diff_output[:5000] if len(diff_output) > 5000 else diff_output

自動プッシュの安全性

自動プッシュ機能は環境変数で明示的に有効化しない限り動作しません。これにより、意図しないプッシュを防ぎます:

# AUTO_PUSHが1の場合のみプッシュを実行
if os.environ.get('CLAUDE_CODE_AUTO_PUSH', '0') == '1':
    subprocess.run(['git', 'push'], check=True)

環境変数一覧

環境変数 説明 デフォルト値
CLAUDE_CODE_COMMIT_LANGUAGE コミットメッセージの言語 日本語
CLAUDE_CODE_DEFAULT_COMMIT_MESSAGE Gemini失敗時のデフォルトメッセージ chore: Claude Codeによる自動修正
CLAUDE_CODE_AUTO_PUSH 自動push機能の有効/無効(0/1) 0(無効)

まとめ

claude-code-auto-commitを使うことで、Claude Codeによる開発がより効率的になりました。特に以下の点が便利です:

  • 手動コミットの手間が省ける:Claude Codeが修正したらそのまま記録される
  • 適切なコミットメッセージ:AIが変更内容を理解して適切なメッセージを生成
  • 自動プッシュでさらに効率化:リモートへの同期も自動化できる
  • 開発履歴の可視化:すべての変更が自動的にGitに記録される

Claude Codeを使っている方は、ぜひ試してみてください!

Discussion