【コピペで導入】lazygit × Claude Code でコミットメッセージ自動生成
lazygit + Claude Code でコミットメッセージを自動生成する方法【Conventional Commits対応】
AI エージェントにコードを書かせる場面が増え、コミットの回数も増える一方だ。毎回メッセージを考える手間を、lazygit の Ctrl+G 一発で解消する方法を紹介する。
完成形:コピペですぐ使える設定
結論から。以下を lazygit の config.yml に追加すれば動く。
設定ファイルの場所(OS・環境により異なる)
- macOS(デフォルト):
~/Library/Application Support/lazygit/config.yml- macOS(XDG_CONFIG_HOME 設定済み):
~/.config/lazygit/config.yml- Linux:
~/.config/lazygit/config.yml
customCommands:
- key: "<c-g>"
context: "files"
description: "Claude で Conventional Commits のメッセージを生成してコミット"
output: "terminal"
command: |
if git diff --cached --quiet; then
echo "No staged changes to commit."
exit 1
fi
CLAUDE_BIN="${CLAUDE_BIN:-$(command -v claude || true)}"
if [ -z "$CLAUDE_BIN" ] && [ -x /opt/homebrew/bin/claude ]; then
CLAUDE_BIN=/opt/homebrew/bin/claude
fi
if [ -z "$CLAUDE_BIN" ] || [ ! -x "$CLAUDE_BIN" ]; then
echo "Claude CLI not found in PATH."
exit 1
fi
PROMPT_CONTENT="$(
cat <<'EOF'
以下の staged diff だけを根拠に、Conventional Commits 形式の1行コミットメッセージを日本語で生成してください。
形式: type(scope): 日本語の要約
type は feat, fix, docs, style, refactor, test, chore のいずれかを使ってください。
出力はコミットメッセージ本文のみ。コードフェンスや補足説明は禁止です。
Staged diff:
EOF
git diff --cached
)"
MSG="$(CLAUDE_SKIP_NOTIFY_HOOKS=1 "$CLAUDE_BIN" --print --model haiku "$PROMPT_CONTENT")"
if [ -z "$MSG" ]; then
echo "Claude did not return a commit message."
exit 1
fi
git commit -e -m "$MSG"
変更をステージングした後、lazygit の Files パネルで Ctrl+G を押す。Claude が diff を読み、Conventional Commits 形式のメッセージを生成し、エディタで確認してからコミットできる。
前提条件
lazygit
brew install lazygit
詳細は lazygit 公式リポジトリ を参照。
Claude Code CLI
npm install -g @anthropic-ai/claude-code
claude # 初回起動で認証
詳細は Claude Code 公式ドキュメント を参照。
設定の中身を理解する
コピペで動かすだけでも十分だが、カスタマイズしたい場合は各パーツの役割を知っておくと便利だ。
customCommands の基本構造
lazygit の customCommands は、任意のキーバインドにシェルコマンドを割り当てる機能だ。
| フィールド | 値 | 役割 |
|---|---|---|
key |
"<c-g>" |
Ctrl+G にバインド |
context |
"files" |
Files パネルで有効化 |
output |
"terminal" |
コマンド出力をターミナルに表示 |
command |
シェルスクリプト | 実行する処理 |
staged diff の取得とバリデーション
コマンド冒頭で、ステージングされた変更の有無をチェックしている。
if git diff --cached --quiet; then
echo "No staged changes to commit."
exit 1
fi
git diff --cached --quiet は staged diff が空のとき exit code 0 を返す。何もステージングしていない状態での誤実行を防ぐガードだ。
続いて Claude CLI のパスを解決する。command -v claude で PATH を検索し、見つからなければ Homebrew のデフォルトパス /opt/homebrew/bin/claude をフォールバックとして試す。
プロンプト設計
Claude に渡すプロンプトは、ヒアドキュメントで staged diff と結合している。
PROMPT_CONTENT="$(
cat <<'EOF'
以下の staged diff だけを根拠に、Conventional Commits 形式の1行コミットメッセージを日本語で生成してください。
形式: type(scope): 日本語の要約
type は feat, fix, docs, style, refactor, test, chore のいずれかを使ってください。
出力はコミットメッセージ本文のみ。コードフェンスや補足説明は禁止です。
Staged diff:
EOF
git diff --cached
)"
設計上のポイントは3つ。
- フォーマットを明示:
type(scope): 要約という Conventional Commits の形式を指定 - 出力制約: コードフェンスや補足説明を禁止し、コミットメッセージ本文だけを出力させる
- staged diff のみ:
git diff --cachedで staged された変更だけを渡し、作業中の変更が混入しない
Claude Code の呼び出しと git commit
MSG="$(CLAUDE_SKIP_NOTIFY_HOOKS=1 "$CLAUDE_BIN" --print --model haiku "$PROMPT_CONTENT")"
この1行に3つのフラグと1つの環境変数が詰まっている(詳細は後述の「フラグ・環境変数リファレンス」を参照)。
生成されたメッセージは git commit -e -m に渡す。-e フラグにより、メッセージがエディタで開かれる。確認・修正してから保存すればコミット完了だ。
ここに至るまでの試行錯誤
完成形に至るまでに4段階の改善を経た。同じ構成を組む人が同じ罠にハマらないよう、各ステップの問題と解決策を共有する。
Step 1: 外部スクリプト方式(初期版)
最初は lazygit-claude-commit.sh という別スクリプトを用意し、lazygit から呼び出していた。
command: |
DOTFILES_DIR="${DOTFILES_DIR:-$HOME/ghq/github.com/yoshihiko555/dotfiles}"
"$DOTFILES_DIR/scripts/lazygit-claude-commit.sh"
問題: dotfiles のディレクトリパスに依存し、環境が変わると動かない。
解決: スクリプトの内容を config.yml にインライン化した。設定ファイル1つで完結するため、dotfiles ごと持ち運べばどの環境でも動く。
Step 2: インライン化 + 英語プロンプト
外部スクリプトを廃止し、コマンドを config.yml に直接記述した。ただし最初のプロンプトは英語だった。
問題: プロジェクトのコミット履歴を日本語で統一していたため、英語メッセージが混在して git log の一貫性が崩れた。
解決: プロンプトを日本語に変更し、「日本語で生成してください」と明示した。
Step 3: 日本語化 + 周辺課題の解決
プロンプトを日本語に書き換えると同時に、運用で見つかった周辺課題も解決した。
通知フックの抑制: Claude Code は完了時にフックを実行する仕組みを持つ。--print モードでも毎回通知が飛んでしまい煩わしかった。CLAUDE_SKIP_NOTIFY_HOOKS=1 環境変数で抑制できる。
lazygit の設定ディレクトリ問題: GNU Stow で dotfiles を管理している環境では、~/.config/lazygit/ が正しく認識されないことがあった。.zshrc にラッパー関数を追加して解決した。
lazygit() {
XDG_CONFIG_HOME="$HOME/.config" command lazygit "$@"
}
エディタ確認の追加: 当初は git commit -m "$MSG" で直接コミットしていたが、AI の生成結果を無条件に受け入れるのはリスクがある。-e フラグを追加し、コミット前に必ずエディタで確認するフローに変更した。
フラグ・環境変数リファレンス
Claude Code CLI フラグ
| フラグ | 役割 |
|---|---|
--print |
非対話モード。結果を標準出力に出力し、ターミナル UI を起動しない |
--model haiku |
Haiku モデルを指定。高速・低コストで、コミットメッセージ生成には十分 |
環境変数
| 変数 | 役割 |
|---|---|
CLAUDE_SKIP_NOTIFY_HOOKS=1 |
Claude Code のフック通知をスキップする |
運用してみてのポイント
エディタ確認は外さない
AI が生成したメッセージは8割方そのまま使えるが、スコープ名の選択や要約の粒度が微妙なケースもある。git commit -e によるエディタ確認は外さないほうがいい。確認に要する時間は数秒で、ゼロからメッセージを考えるよりはるかに速い。
Haiku モデルで十分
コミットメッセージ生成は「diff を読んで1行にまとめる」タスクだ。Sonnet や Opus のような大型モデルは不要で、Haiku の速度とコストが最適なバランスになる。レスポンスは体感1〜2秒で返ってくる。
staged diff だけを渡す理由
git diff --cached(staged のみ)を使い、git diff(unstaged 含む)は使わない。理由は明確だ。
- コミット対象の変更だけをメッセージに反映させたい
- 作業中の未ステージング変更が含まれると、メッセージの焦点がブレる
- lazygit でファイル単位にステージングを調整した後に
Ctrl+Gを押すワークフローと整合する
まとめ
lazygit の customCommands と Claude Code の --print モードを組み合わせれば、Ctrl+G 一発で Conventional Commits 形式のコミットメッセージを自動生成できる。設定は config.yml に約30行で完結し、導入コストは低い。
AI にコードを書かせる機会が増えるほど、コミット回数も増える。メッセージを毎回手で考える時間を、この仕組みで取り戻してほしい。
Comments