gitのコミットメッセージに進んだ字数を記入

その日の作業を数えたい

論文を執筆するときに、作業の進捗を記録することがよいとよく言われる。 でも、毎回字数を数えるのもちょっとめんどうだ。

例えば、その日の作業を終えるときにgitでコミットする。コミットメッセージに進んだ字数を自動的に入れておいてくれればかなり楽ではないか。

なんかいいのないかな?と探していたら、jMatsuzakiさんという方が、便利なシェルスクリプトを公開してくれている。

執筆やプログラミングの相棒として使える「Git Character Counter」なるものを作成して公開しました。 (出所:「Gitリポジトリに追加された文字数をカウントするシェルスクリプト公開 | jMatsuzaki」、(https://jmatsuzaki.com/archives/28195

しかし、僕の環境だとうまく動かないのか、コミットメッセージに入れてくれるわけではないようだ。

汎用的に、「どれだけ進んだかな?」ということには使えそうなんだけど。

Windowsでコミットメッセージ自動的に字数を挿入する方法

少し調べてみると、.git/hooks/prepare-commit-msgでコミットメッセージを編集できるらしい。

issue番号を自動で入力する (出所:「git commitする時にissue番号を自動で入力するgit hooks」、(https://gist.github.com/saxsir/5cd33801fc2a77a1b1f8

jMatsuzakiさんのスクリプトをsaxirさんのスクリプトに混ぜ込むと、うまく動くものができた。

ただし、僕のばあい、sedとwcコマンドは別途用意した。 まず、scoopでsedコマンドをインストールした。wcはscoopには見つからなくて、どうしようもなかったので、wslのwcを使用した。 sedもwslのものを使うなら、それぞれの前にwslを入れておくとよい。

それから、今回の利用方法ではステージングされているファイルとリポジトリの最新のコミットとの差分を見ればいいので、オプションも決め打ちにしておいた。

prepare-commit-msgの中身

最終的には以下で動くようになった。

#!/bin/sh
if [ "$2" == "" ] ; then
  mv $1 $1.tmp
  echo -e "\nprogress: `git diff -p -b -w -U0 --diff-filter=AM --ignore-cr-at-eol --ignore-space-at-eol --ignore-blank-lines --ignore-matching-lines="^(---|uid|title|aliases|date|update|tags[]|draft)" "@" "--cached" | grep ^+ | grep -v ^+++ | sed s/^+// | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' | wsl wc -m`" > $1
  cat $1.tmp >> $1
fi

コミットしてみると、以下のようなコミットメッセージが作成される。

> git commit -m '字数数えるよ'

字数数えるよ

progress: 8

1 file changed, 1 insertion(+), 1 deletion(-)

いい感じ!

Hugo で構築されています。
テーマ StackJimmy によって設計されています。