Gitリポジトリに追加された文字数をカウントするシェルスクリプト公開

Gitリポジトリの追加文字数をカウントするシェルスクリプト「Git Character Counter」公開

私の愛しいアップルパイへ

アブラカタブゥラッ!

このたび執筆やプログラミングの相棒として使えるGit Character Counterなるものを作成して公開しました。

このシェルスクリプトは、Git Diffの結果から文章に新たに追加された文字数をカウントします。

これは日課としている執筆やプログラミングの生産性を計測する指標として使えます。なんと甘美なひらめき!

Gitリポジトリの追加文字数をカウントするシェルスクリプト「Git Character Counter」

文字数カウントのアプリケーションやソフトウェアは数多くありますが、多くは指定したアプリケーションの打鍵数をカウントするか、指定したフォルダまたはファイルの増分をカウントします。

前者の場合、単一のアプリケーションで複数の作業やプロジェクトを処理する場合にノイズが多すぎます。私の場合、執筆とプログラミングをはじめかなりの作業をNeovim上で行うので、アプリケーション指定の文字カウントはあまり意味がありません。

後者の場合、単一のフォルダで複数のプロジェクトを扱う場合にノイズが多すぎます。私の場合、Zettelkastenを用いて執筆しているため、あらゆるプロジェクトの文章が単一フォルダ内で展開します。

このような単一のアプリケーションで複数の作業をしていて、かつ単一のフォルダで複数プロジェクトの執筆を扱うようなケースでも、Gitリポジトリおよびコミットごとに文字数の増分をカウントできれば意味のある数字を得ることができます。

Gitリポジトリの差分から文字数をカウントできれば、以前のバージョンからどれだけ文字数が追加されたかをいつでも確認できます。これは書籍や論文の執筆などに有用です。

また、コミットごとに文字数をカウントできるので、作業単位で追加された文字数をカウントできます。これは複数のメディアを運用している場合などに有用です。

しかし、残念ながら通常Git Diffは追加の行数しかカウントしてくれません。しかし、あなたは運が良い。私がここにいるのですから。

かくしてjMatsuzakiはGit Diffの結果から文字数をカウントするシェルスクリプト「Git Character Counter」を作成・公開しました。

Git Character Counterの使い方

「Git Character Counter」の使い方は簡単です。カプチーノを作るよりもずっと簡単です。用意するものはbashとGitだけです。

ターミナル上で文字数をカウントしたいGitリポジトリのフォルダに移動し、対象をステージにaddしたうえで本スクリプトを実行します。

cd /path/to/repository
git add .
bash /foo/bar/git-character-counter.sh

すると、次のように対象となるファイルと文字数のカウント結果を出力してくれます。Sweeeeeet!

=================================================
Welcome to git character counter
=================================================

Target commits are as follows:
From:@..To:--cached

The target files are as follows:
M    README.md
M    git-character-counter.sh

The number of Characters added is as follows:
Total:     1896

この例では現在ステージングされている2つのファイルで1,896文字追加されたことが分かります。

Git Character Counterはデフォルトでステージ(Index)を対象とします(作業ツリーではなく)。こうすることで変更したファイルの中でも計測対象を選べます。また、新規追加ファイルも対象にできます。

-f(From)と-t(To)のオプションを使えば計測対象の始点と終点を指定できます。数字を指定するとHEADからの距離を指定できます。たとえば、最新のコミット(HEAD)で追加された文字カウントを追加するには次のようにします。

git-character-counter.sh -f 1 -t 0

コミットのハッシュも指定できます。40けたのハッシュとは別に、7けたの短縮系も使えます。

git-character-counter.sh -f 48b5460a426cf2beffd6d71f089d9c3278b4f705 -t 196ff5bdabaf10afdeb40f7623e0cc09eea1d7a5
git-character-counter.sh -f 48b5460 -t 196ff5b
git-character-counter.sh -f 48b5460a426cf2beffd6d71f089d9c3278b4f705 -t 196ff5b

日付も指定できます。日付の表記はdate expressionとISO dateに対応しています。

git-character-counter.sh -f "2 days ago" -t yesterday
git-character-counter.sh -f 2022-02-05 -t 2022-02-06
git-character-counter.sh -f "2022-02-06 0:00" -t "2022-02-06 23:59"

ただし、Gitのdiffにおいて日付は曖昧な概念ですので、正確に意図したとおりの文字数をカウントしたい場合にはハッシュ指定をお勧めします。

ちなみに-wオプションを使えば文字数の代わりに単語数をカウントできますが、日本語ファイルの場合は単語数の計算があまり正確でないので文字数がお勧めす。

なお、Git Hooksのpre-commitフック(.git/hooks/pre-commit)と組み合わせれば、いまコミットしたファイルに追加された文字数を自動的に画面に表示できます。

# .git/hooks/pre-commit

bash /foo/bar/git-character-counter.sh

ファイルをコミットすると次のようになります。

=================================================
Welcome to git character counter
=================================================

Target commits are as follows:
From:@..To:--cached

The target files are as follows:
M    20210108145021.md

The number of Characters added is as follows:
Total:       39

[master fbaa44f] Git Character Counterテスト
 1 file changed, 3 insertions(+), 1 deletion(-)
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 10 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 408 bytes | 408.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:jmatsuzaki/Zettelkasten.git
   16cae33..fbaa44f  master -> master

さらなる詳細はGitHubのリポジトリをご覧ください。

執筆ペースが分かれば習慣化しやすくなる

どれだけの時間のうちにどれだけの文字を執筆できるか自分の執筆ペースが分かっていると習慣化に役立ちます。

執筆というクリエイティブな作業に明確な終了基準を設けられるためです。

たとえば「書籍の執筆を25分間進める」というタスクがあったとします。これも悪くないですが、もし25分間のうちに平均して700文字執筆できることが分かっていれば、「書籍を700文字執筆する」というタスクに変換できます。

やってみると分かりますが、「書籍の執筆を25分間進める」よりも「書籍を700文字執筆する」の方が執筆に集中できることが分かります。

「執筆を25分間進める」というのは内容が曖昧です。執筆の間にSNSへ脱線していても時間は進むからです。極端な話、25分間のほとんどをSNSを見たりYouTubeを見ることに費やしていても、執筆が進んだ気になってしまいます。すると、執筆を進める気持ちでSNSやYouTubeへ脱線することが容易に習慣化されてしまいます。脱線の方が報酬になりやすいからです。

「書籍を700文字執筆する」タスクは書き進めることが終了基準となるため、執筆にコミットすることが求められます。執筆にコミットするタスクを続けていれば、集中が報酬になります。すると、脱線ではなく書き進めることが適切に促進されます。

具体的な実践方法としてはみそしるさんによる研究の進め方が参考になります(というよりもこの記事に触発されて、このスクリプトを作りました。ダンケ!)。

貴下の従順なる下僕 松崎より

著者画像

システム系の専門学校を卒業後、システム屋として6年半の会社員生活を経て独立。ブログ「jMatsuzaki」を通して、小学生のころからの夢であった音楽家へ至るまでの全プロセスを公開することで、のっぴきならない現実を乗り越えて、諦めきれない夢に向かう生き方を伝えている。