👌

git hookでcommit時にtypoを自動検知

2022/03/23に公開

概要

git hookでcommit時にtypoを確認し、typoが確認された場合commitを中止する機能を実装する。

動作環境

  • Windows 10 Home
  • git 2.32.0
  • typos-cli 1.5.0

git hookとは?

git hookはgitのバージョン管理システム内でgit特有のアクションが発生した際に、予め作成していたスクリプトを実行できる機能です。
例えば、commitやpush時に特定の条件を満たしていない場合はcommitやpushを中止するなどが挙げられます。
これはデフォルトで、git initをした際に作成される.gitに対して.git/hooksの中に作成されます。

typoを検知するためtyposの準備

typoを検知するためにRust製のtyposを使用します。
https://github.com/crate-ci/typos
Rustの実行環境がある場合はRustからインストールできますが、今回はRustの実行環境が整っていないためzipでダウンロードして実行ファイルのみを取り出して使用していきます。
https://github.com/crate-ci/typos/releasesからv1.5.0のWindows版のzipをダウンロードして展開し、typos.exeを切り取ってC:\Windowsに貼り付けます。powershellから以下のコマンドを実行することでtyposのバージョンが表示されていればtyposの設定は完了です。

typos --version

commit時に自動でtypoを検出する

workディレクトリを作成しその中でgitにようるバージョン管理を開始する。

mkdir work
cd work
git init

gitリポジトリを作成後、.git内のhooksディレクトリに移動しpre-commitファイルを作成する。

cd .git/hooks
touch pre-cmmit

pre-commitファイルの内容を以下通りに変更する。

pre-commit
#!/bin/sh

# 変更差分をチェックしたい場合
# git diff --cached --diff-filter=AM | typos -
# 変更ファイルをチェックしたい場合
git diff --cached --name-only --diff-filter=AM | xargs typos

# typoがある場合にコミットを防ぐ
if [[ $? -ne 0 ]]; then
  exit 1
fi

ここまで出来たらディレクトリをworkに戻してcommitを実行し、typoが検知されるかを確認する。
今回はwork内でsample.txtを以下の内容で作成し、commitを実行する。

sample.txt
anounce

commit typo

適切にsample.txt内のanounceのtypoを検知しcommitを中断することができた。

typoが検知されない場合の対処法1

pre-commitファイルの実行権限を確認してみる。

ls -l

もし、実行権限がない場合は実行権限を付与する。

chmod +x pre-commit

typoが検知されない場合の対処法2

エラーメッセージにfatal: cannot run pre-commitと表示されている場合、以下のコマンドを実行する。

git config --get core.hooksPath

このとき .git/hooks が出力されない場合は以下を実行する。

git config --global core.hooksPath ".git/hooks"

実行後、以下のコマンドでgitの設定情報を確認し core.hooksPath=.git/hooksの記載があることを確認する。

参考記事

https://qiita.com/naro143/items/009af8897643fe990db8
https://stackoverflow.com/questions/20609816/git-pre-commit-hook-is-not-running-on-windows
https://git-scm.com/book/ja/v2/Git-のカスタマイズ-Git-フック

Discussion