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

はじめに
コミットメッセージ、ちゃんと書いてますか?
私は正直、めんどくさくて wip とか fix とか雑なコミットメッセージを量産していました。
後から履歴を見返すと何をしたのかさっぱりわからない...とりあえず rebase でまとめちゃおう。
そんな経験、ありませんか?
以前作ったツールの課題
以前、Gemini CLI を使ったコミットメッセージ自動生成ツールを作りました。
便利だったのですが、使い続けるうちに課題が見えてきました。
- 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 -i で reword するのは面倒ですよね。--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/
設定
初回実行時に ~/.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 は正規表現として評価されるので、柔軟なマッチングが可能です。
プレフィックス判定フロー
設定が複雑に見えるかもしれませんが、判定ロジックはシンプルです。
優先順位は:
- prefix_scripts(カスタムスクリプト)
- prefix_rules(URLベースルール)
- 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 で実装しています。理由は:
- シングルバイナリ: 依存関係なしで配布できる
- 高速起動: コミットのたびに実行するのでレスポンスが重要
- クロスプラットフォーム: macOS、Linux、Windows 全対応
- 型安全: 設定ファイルのパースなどでバグを未然に防げる
外部 CLI(Gemini CLI など)の呼び出しは std::process::Command でシンプルに実装し、出力のパースと整形を行っています。
まとめ
git-sc を使い始めてから、コミットメッセージに悩む時間がゼロになりました。
- 「wip」コミットをしなくなった
- Gemini のレート制限を気にしなくてよくなった(スマートクールダウンで自動回避)
- プロジェクトごとのコミット規約に自動で対応してくれる
-
--rewordで過去コミットも簡単に修正できる
「コミットメッセージを書くのがめんどくさい」という方、ぜひ試してみてください。
Discussion