📓

git commit -v 時に git log を追加で見せる

に公開

tl;dr

  • git のフックでコミット時にログを一緒に表示して、なるべくコミットメッセージのツラを揃えようと思った
  • pre-commit(prek) にしようと思ったんだけどやめたのでコードの供養

何をしようとしたか

  • git のコミットメッセージを書く時に、直近の履歴をさっと確認できたらいいなと思った
  • 割と高頻度に複数の作業を切り替えてコミットするので、コミットタイトルをなるべく揃えやすいようにということ
  • たとえば docs: xxx や docs(xxx): あれこれ や docs: あれこれを xxx に書いた みたいになるの嫌じゃん?
  • git log -n 10 --oneline がついてればなんとかなるかなと思ったってわけ

環境

  • Ubuntu 24.04 on Windows 11 + WSL2
  • VS Code のワークスペースを Ubuntu にしている
  • Windows 上で VS Code を使ってるけど Ubuntu でファイル管理とコマンドラインを使っている
  • Windows ネイティブな何かや PowerShell は使っていない
  • VS Code の git 系エクステンションはほぼ使っていない
  • git を使う時は VS Code のターミナルでコマンドを打ってる、ということ

設定(いらんかった)

  • git コマンドは alias して g (alias g='git')
  • git commit は alias して gcv (alias gcv='git commit -v')
  • 何かの経緯でコメントを ; にしている (git config core.commentchar ;)

コード

  • .git/hooks/prepare-commit-msg
  • chmod +x .git/hooks/prepare-commit-msg を忘れずに
  • フックタイミングが prepare-commit-msg なのでファイル名はこれで固定
  • (リポジトリ内にシェルとして切り出して管理しつつフックで呼び出してもいいけど)
.git/hooks/prepare-commit-msg
#!/bin/sh

set -eu

MSG_FILE="$1"
COMMIT_SOURCE="${2:-}"

# merge / squash / amend は除外
case "$COMMIT_SOURCE" in
  merge|squash|commit)
    exit 0
    ;;
esac

# comment char を Git 設定から取得(未設定時は #)
COMMENT_CHAR="$(git config --get core.commentchar || echo '#')"
MARKER="${COMMENT_CHAR} ---- Recent commits ----"

# すでに挿入済みなら何もしない
if grep -q "^$(printf '%s' "$MARKER" | sed 's/[]\/$*.^[]/\\&/g')" "$MSG_FILE"; then
  exit 0
fi

TMP_FILE="$(mktemp)"

{
  echo ""
  echo "$MARKER"
  git log -n 5 --oneline | sed "s/^/${COMMENT_CHAR} /"
  echo "$COMMENT_CHAR"
  cat "$MSG_FILE"
} > "$TMP_FILE"

mv "$TMP_FILE" "$MSG_FILE"

実際に使ってみると

alt text

  • プライベートリポジトリでテストしてるので中身についてはアレでw
  • 期待どおりに出力されてる(5行にしてるけど)
  • 悪くはない

なぜやめたか

  • pre-commit(prek)にするなら local かどっかリポジトリで切り出す必要がある
  • ローカル単独で hook シェルをリポジトリに埋めるのがちょっと嫌(pre-commitは設定ファイルだけしか管理に含めたくない)
  • パブリックリポジトリに切り出してメンテナンスするほど労力を割きたくない
  • シェルを育てて実行有無をフラグして、Windows で動かすために python で書き直すとか git 入り docker にするとか、正直めんどい
  • Go の練習にどうだろうとか思ったんだけど、ChatGPT が Go で git の処理書くのはオススメしないって
  • ぶっちゃけこんなのあっても使いたい人も自分以外にそんなにいない(と思った)

というわけで

  • ChatGPT にちょっと聞いてささっと手直しして使ってみたけど特定のリポジトリ内だけで死蔵されることが決定
  • せっかく書いたのでとりあえず供養することにした
  • VS Code で WSL ワークスペースにして bash ターミナルで git 叩いてるやついるぅ?いねぇよなぁ(イメージ略

Discussion