👋

もう「wip」コミットを作らない!AI自動フォールバックでコミットメッセージを生成するgit-scを作った

に公開

はじめに

コミットメッセージ、ちゃんと書いてますか?

私は正直、めんどくさくて wip とか fix とか雑なコミットメッセージを量産していました。
後から履歴を見返すと何をしたのかさっぱりわからない...とりあえず rebase でまとめちゃおう。
そんな経験、ありませんか?

以前作ったツールの課題

以前、Gemini CLI を使ったコミットメッセージ自動生成ツールを作りました。

https://zenn.dev/owayo/articles/9461d3ebb3b77a

便利だったのですが、使い続けるうちに課題が見えてきました。

  • Hooks 専用設計: Claude Code の Hooks から呼び出す前提だったため、手動コミット時に単体で使えない
  • レート制限: Gemini CLI の無料枠では、開発が盛り上がるタイミングで制限に達してしまう

世の中の既存ツールは?

コミットメッセージを AI で自動生成するツールは他にもあります。しかし、多くは OpenAI API キーを設定して従量課金で使う形式です。

私は Claude Code や Codex CLI など定額で契約しているサービスがあるので、追加の API 利用料を払うのではなく、既に使っているサービスの中で完結させたかったのです。

git-sc の開発

そこで、これらの課題を解決する新しいツール git-sc を Rust で開発しました。

複数の AI プロバイダーに対応し、自動フォールバックするのが最大の特徴です。

git-sc とは

git-sc(git smart commit の略)は、ステージされた変更と過去のコミット履歴を分析し、CLI AIエージェント(Gemini CLI、Codex CLI、Claude Code)を使って文脈に適したコミットメッセージを自動生成するツールです。

主な特徴

  • マルチプロバイダー対応: Gemini CLI、Codex CLI、Claude Code を自動フォールバック付きでサポート
  • スマートクールダウン: 失敗したプロバイダーを自動的に一定時間(デフォルト1時間)優先度を下げる
  • フォーマット自動検出: 過去のコミットから形式を自動判断(Conventional Commits、ブラケット形式など)
  • 柔軟な設定: プロバイダー優先度、言語、モデルをカスタマイズ可能
  • URL別ルール設定: リポジトリごとに異なるプレフィックス形式を指定可能

自動フォールバックの威力

これが git-sc の真骨頂です。Gemini がレート制限に達しても、自動的に次のプロバイダーに切り替わります。

$ git-sc -a
Staging all changes...
Using prefix rule for git@github\.com\.owayo: conventional
Generating commit message...
  Using Gemini CLI...
 Gemini CLI failed: [API Error: You have exhausted your daily quota on this model.]
  Using Codex CLI...

Generated commit message:
──────────────────────────────────────────────────
docs: CLAUDE仕様ガイドを追加
──────────────────────────────────────────────────

Create this commit? [Y/n] Y
 Commit created successfully!

Gemini が使えなくても、Codex が、Codex もダメなら Claude Code が引き継いでくれます。開発の流れを止めることなく、常に適切なコミットメッセージを生成できます。

スマートクールダウン

自動フォールバックだけでなく、失敗したプロバイダーを「学習」する機能もあります。

プロバイダーが失敗した場合(例:API クォータ超過)、git-sc は自動的にそのプロバイダーの優先度を設定可能な時間(デフォルト:1時間)下げます。

# 1回目:gemini がエラー
$ git-sc -a
  Using Gemini CLI...
  ⚠ Gemini CLI failed: [API quota exceeded]
  Using Codex CLI...
✓ Commit created successfully!

# 2回目以降(1時間以内):gemini が後回しになる
$ git-sc -a
  Using Codex CLI...   # gemini ではなく codex から開始
✓ Commit created successfully!

これにより、毎回失敗するプロバイダーを試す時間を節約し、スムーズなワークフローを実現します。

クールダウン時間は ~/.git-sc で設定可能です:

provider_cooldown_minutes = 120  # デフォルトの60分ではなく120分に

0 に設定すると、クールダウン機能を無効にできます。

--reword で過去コミットを修正

git rebase -ireword するのは面倒ですよね。--reword オプションを使えば、一発で過去のコミットメッセージを AI で再生成できます。

$ git-sc --reword 2
Reword mode: regenerating message for commit 2 back...
Current commit message:
  feat: 新機能を追加
Generating commit message...
  Using Gemini...
Generated commit message:
──────────────────────────────────────────────────
feat: ユーザー認証機能を追加
──────────────────────────────────────────────────

Reword commit 2 back? [Y/n] Y

 Commit 2 back reworded successfully!
Note: You may need to force push (git push --force) if already pushed.

内部的には git rebase を使用しているので、変更内容はそのままにメッセージだけを更新します。

インストール

前提条件

以下の CLI AIエージェントのうち、少なくとも1つがインストールされている必要があります:

# Gemini CLI
npm install -g @google/gemini-cli

# Codex CLI
npm install -g @openai/codex

# Claude Code
npm install -g @anthropic-ai/claude-code

バイナリのインストール

GitHub Releases からお使いのプラットフォーム用のバイナリをダウンロードできます。

macOS (Apple Silicon)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-aarch64-apple-darwin.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

macOS (Intel)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-x86_64-apple-darwin.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

https://github.com/owayo/git-smart-commit/releases

設定

初回実行時に ~/.git-sc に設定ファイルが自動作成されます。

# AIプロバイダーの優先順序(最初に利用可能なものが使用される)
providers = [
    "gemini",
    "codex",
    "claude",
]

# コミットメッセージの言語
language = "Japanese"

# 各プロバイダーのモデル設定
[models]
gemini = "flash"
codex = "gpt-5.1-codex-mini"
claude = "haiku"

プロバイダーの順序を変更したい場合は、配列の順番を入れ替えるだけです。

使い方

基本的な使い方

# ステージされた変更のコミットメッセージを生成
git-sc

# ステージされていない変更も、全ての変更をステージしてコミット(よく使う)
git-sc -a

# 直前のコミットメッセージを再生成(rebaseでまとめた後によく使う)
git-sc --amend

# 過去のコミットメッセージを再生成(rebase -i で reword する代わりに)
git-sc --reword 3  # 3つ前のコミットを reword

# 現在のブランチのコミットを1つにまとめてメッセージを作成(開発完了してrebaseでまとめるところから全てやりたいときに使う)
git-sc --squash origin/main -y

よく使うコンビネーション

# 全てステージして確認なしでコミット(AIエージェントのHooks向け)
git-sc -a -y

フォーマット自動検出

git-sc は過去5件のコミットメッセージを分析し、プロジェクトで使われている形式を自動検出します。

対応フォーマット

フォーマット
Conventional Commits feat: add user authentication
ブラケット形式 [Add] new feature
コロン形式 Add: new feature
絵文字形式 ✨ add new feature
プレーン形式 Add new feature

既存のプロジェクトの慣習に自動的に合わせてくれるので、チーム開発でも安心です。

URL別ルール設定(上級者向け)

リポジトリのリモートURLに基づいて、異なるプレフィックス形式を指定できます。

# GitHub の特定組織では Conventional Commits を使う
[[prefix_rules]]
url_pattern = "github\\.com[:/]myorg/"  # HTTPSとSSHの両方にマッチ
prefix_type = "conventional"

# GitLab では絵文字形式を使う
[[prefix_rules]]
url_pattern = "^https://gitlab\\.example\\.com/"
prefix_type = "emoji"

url_pattern は正規表現として評価されるので、柔軟なマッチングが可能です。

プレフィックス判定フロー

設定が複雑に見えるかもしれませんが、判定ロジックはシンプルです。

優先順位は:

  1. prefix_scripts(カスタムスクリプト)
  2. prefix_rules(URLベースルール)
  3. Auto(過去コミットから自動判定)

Claude Code との連携

Claude Code の Hooks 機能を使えば、セッション終了時に自動でコミットできます。

~/.claude/settings.json に以下を追加:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "git-sc --all --yes"
          }
        ]
      }
    ]
  }
}

cchook を利用している場合は ~/.claude/cchook/config.yaml に以下を追加:

Stop:
  - actions:
      - type: command
        command: 'git-sc --all --yes'

これで Claude Code でコーディングした後、セッション終了時に自動的に適切なコミットメッセージでコミットされます。

技術的な話(Rust で書いた理由)

このツールは Rust で実装しています。理由は:

  1. シングルバイナリ: 依存関係なしで配布できる
  2. 高速起動: コミットのたびに実行するのでレスポンスが重要
  3. クロスプラットフォーム: macOS、Linux、Windows 全対応
  4. 型安全: 設定ファイルのパースなどでバグを未然に防げる

外部 CLI(Gemini CLI など)の呼び出しは std::process::Command でシンプルに実装し、出力のパースと整形を行っています。

まとめ

git-sc を使い始めてから、コミットメッセージに悩む時間がゼロになりました。

  • 「wip」コミットをしなくなった
  • Gemini のレート制限を気にしなくてよくなった(スマートクールダウンで自動回避)
  • プロジェクトごとのコミット規約に自動で対応してくれる
  • --reword で過去コミットも簡単に修正できる

「コミットメッセージを書くのがめんどくさい」という方、ぜひ試してみてください。

https://github.com/owayo/git-smart-commit

Discussion