logo
Search
Programming

【コピペで導入】lazygit × Claude Code でコミットメッセージ自動生成

#git #claude code #lazygit
Mar 15th 2026 Mar 15th 2026
【コピペで導入】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つ。

  1. フォーマットを明示: type(scope): 要約 という Conventional Commits の形式を指定
  2. 出力制約: コードフェンスや補足説明を禁止し、コミットメッセージ本文だけを出力させる
  3. 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