趣味で書いている小説をgitで管理していて、進捗把握のためにコミットメッセージにその日1日書いた総文字数を入れ込んでいます。

commit message

こんな感じで。

以前までは、SF作家である藤井太洋先生自身が公開してくださっている拡張機能: novel-writerのステータスバー表示で文字数を把握し、手動でコミットメッセージを書いていました。
ただ、この方法にはいくつかの(個人的には解決したい)問題があり、

  • 日付が回ると文字数がリセットされるので、うっかりしてると差分の文字数がわからなくなる
  • 特定のファイルや変更は含みたくない場合がある(翌日への自分のメモなど)
  • コミットメッセージへの手打ちを辞めたい

上記二つに関しては、私が拡張機能で出来ることを把握しきれていないだけ or 今後改善される可能性はありますが、どうせならコミット時に自動でコミットメッセージ入力できたら楽だよなぁという動機があったので、ちょっと調べてスクリプトを組んでみました。

やったこと

下記のスクリプトを.git/hooks/commit-msgとして設定します。

#!/bin/bash

# ステージングエリアに追加されたファイルの差分を取得し、文字数をカウントする関数
# .git/hooksに移動させて、`chmod +x .git/hooks/commit-msg`を実行することでコミット時にhookされる
get_character_count() {
    # ステージングエリアに追加されたファイルの差分を取得
    diff_output=$(git diff --cached)

    # 追加された行の文字数を合計する
    added_characters=$(echo "$diff_output" | grep '^+' | sed 's/^+//g' | wc -m)

    # 削除された行の文字数を合計する
    deleted_characters=$(echo "$diff_output" | grep '^-' | sed 's/^-//g' | wc -m)

    # 追加された文字数と削除された文字数の合計を計算する
    total_characters=$((added_characters - deleted_characters))

    # 結果を出力
    echo "$total_characters"
}

# コミットメッセージに追加
character_count=$(get_character_count)
echo "📝 $character_count 文字" >> "$1"

スクリプト内でやっている事はかなりシンプルで、git diffの結果である追加行(+で始まるもの)と削除行(-で始まるもの)の文字数をそれぞれカウントして差し引いて、総文字数を計算しているだけです。

あとはこれに実行権限を渡してあげます。

chmod +x .git/hooks/commit-msg

実際にお試しコミットしてみた結果がこちら。 commit message

便利!
1日の終わりに1コミットするのみ、という前提が必須にはなっちゃいますが、今のところはこれで十分かなと思っています。コードと違ってそんなにこまめにコミット切りたい場面もないし。

これからもgit管理を続けていきたいので、何かやりたいことを思いついて実現できたら公開しようと思います。