0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルLLMでgit commitメッセージを自動化する

0
Posted at

概要

普段、生成AIでコードを書かせたり、commitさせたりすることは当たり前のようになってきている。
しかし、自分でcommitしたいこともあるし、commitのタイミングをこちらでコントロールしたい時もそれなりにある。
安価なサブスクリプション契約をしている場合は、commitなどはトークン消費させるのは勿体ないと思うこともある。
その際に、git commitメッセージを自動化できたら便利かなと思い、やってみることにした。

環境

  • M5 Macbook Air

構成

  • Ollama
    • Ollama. Inc, が開発
    • 無料で使用可能なローカル環境でLLMをダウンロード、実行、管理できるツール
    • ローカルLLMであれば無料で使用可能(クラウド版は有料)
  • gemma4:e4b
    • Google DeepMiindが開発したオープンウェイトなLLM
    • 無料で使用可能
    • パラメータ数でサイズも変わるが今回は実行パラメータ数約45億のe4bを使用(e2bでも動く)

OllamaとGemma4のダウンロード

下記にアクセスしてインストーラーを実行する。
https://ollama.com/

そのあとでollamaコマンドが使用できるようになるので下記を実行すればOK。
なお、e4bとかもダウンロードできるがPCのスペックによっては重くてどうにもならなくなるので注意。

ollama pull gemma4:e2b

設定

git hooksを使って実現する。
aliasとしてはacを指定する。

$ vim ~/.config/git/config or vim ~/.gitconfig

[alias]
    ac = !GIT_EDITOR=true git commit

[core]
    hooksPath    = ~/.git-hooks

git hooks配下に下記のスクリプトを配置する。
commitメッセージの味付けは MSGで自分好みに調整すると良いと思う。

cat ~/.git-hooks/prepare-commit-msg
#!/bin/bash
# git commit 時に ollama でコミットメッセージを自動生成するフック
# 無効化したいときは環境変数 NO_AI_COMMIT=1 を付けて git commit する

COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2

MODEL="${AI_COMMIT_MODEL:-gemma4:e2b}"

# -m / merge / squash などで既にメッセージがある場合はスキップ
[ -n "$COMMIT_SOURCE" ] && exit 0

# 明示的に無効化された場合はスキップ
[ -n "$NO_AI_COMMIT" ] && exit 0

# ollama が無い・起動していない場合は静かにスキップ(コミット自体は妨げない)
command -v ollama >/dev/null 2>&1 || exit 0

DIFF=$(git diff --cached --no-color | head -c 8000)
[ -z "$DIFF" ] && exit 0

echo "AI コミットメッセージを生成中 (${MODEL})..." >&2

MSG=$(ollama run --think=false "$MODEL" "以下の git diff から日本語のコミットメッセージを1行生成してください。

ルール:
- 「何を」「どうした」が具体的に分かるように書く(対象のツール名・ファイル名・バージョン番号などを含める)
- 設定ファイルの変更では、追加・変更された設定キー名や値(core.hooksPath, alias.ac など)をそのまま含める。「設定を追加」のような言い換えは禁止
- 変更が複数ある場合は主要なものをすべて列挙する。一部だけ取り上げて他を省略しない
- 文体は体言止め(〜を追加 / 〜を修正 / 〜を更新)。「〜しました」「〜する」は禁止
- 日本語のみ。英語や英訳の併記は禁止
- 前置き・説明・引用符は不要。コミットメッセージ1行だけを出力する
- 長さは30文字程度に抑える

良い例:
- core.hooksPath と alias.ac を gitconfig に追加
- wezterm.lua のフォント設定を wezterm.font_with_fallback に変

悪い例:
- バージョンを更新しました。 (曖昧・文末が「ました」)
- エディタ設定を追加 (キー名がなく曖昧)
- Update python version (英語)

git diff:
$DIFF" 2>/dev/null)

# 生成に失敗したら何もしない
[ -z "$MSG" ] && exit 0

# 端末制御コードと thinking 出力を除去し、折り返し改行を連結して1行にまとめる
MSG=$(printf '%s' "$MSG" |
  LC_ALL=C sed -e $'s/\x1b\\[[0-9;?]*[a-zA-Z]//g' -e 's/[[:cntrl:]]//g' |
  sed -e '/^Thinking\.\.\./d' -e '/done thinking/d' |
  tr '\n' ' ' | sed -e 's/  */ /g' -e 's/^ //' -e 's/ $//')
printf '%s\n%s' "$MSG" "$(cat "$COMMIT_MSG_FILE")" >"$COMMIT_MSG_FILE"

実行テスト

例えば、e2bからe4bに変えてみる。

❯ git diff
diff --git a/.git-hooks/prepare-commit-msg b/.git-hooks/prepare-commit-msg
index 63726fe..7af9bf7 100755
--- a/.git-hooks/prepare-commit-msg
+++ b/.git-hooks/prepare-commit-msg
@@ -5,7 +5,7 @@
 COMMIT_MSG_FILE=$1
 COMMIT_SOURCE=$2

-MODEL="${AI_COMMIT_MODEL:-gemma4:e2b}"
+MODEL="${AI_COMMIT_MODEL:-gemma4:e4b}"

 # -m / merge / squash などで既にメッセージがある場合はスキップ
 [ -n "$COMMIT_SOURCE" ] && exit 0

addしてacを実行する。

❯ git add .git-hooks/

❯ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   .git-hooks/prepare-commit-msg

そうすると、数秒程度で下記コミットメッセージが追加される。

❯ git ac
AI コミットメッセージを生成中 (gemma4:e4b)...
[master de73422] .git-hooks/prepare-commit-msg のモデル名を gemma4:e2b から gemma4:e4b に更新
 1 file changed, 1 insertion(+), 1 deletion(-)
 
 ❯ git log | head -5
commit de73422617a03176c32cf0f4e77058f7af9ba46c
Author: Kazuma Inamura <xxxxxx@users.noreply.github.com>
Date:   Sat Jul 18 00:10:30 2026 +0900

    .git-hooks/prepare-commit-msg のモデル名を gemma4:e2b から gemma4:e4b に更新
 

まとめ

Ollamaを使ってgit commit メッセージを自動化する方法を書いた。
ちょっと手直ししないとかなと思う時もあるけど、概ねわかりやすいものが出力されているように見受けられている。
思ったよりも手軽に導入できて便利なのでぜひオススメしたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?