「よし、完璧だ!」とコミットした後やPRで指摘されてtypoに気づき、fix: typo
コミットするのはできるだけ避けたいです。
レビューする側にとってもtypoに意識を向けながらレビューをするのは負担になります。貴重な時間はもっと大事な確認と指摘に使いたいものです。
今回は、そんなtypoを自動的に検出してコミットを防ぐ方法を紹介します。
“悲しいfix: typoコミット”
できるようになること
コミット時に変更ファイルのtypoを自動的に検出し、typoがあった場合はtypo箇所と修正のヒントを出力してコミットを防ぎます。typoがない場合はコミットは成功します。
設定方法
typoの検出
typoの検出にはRust製のtyposを採用しました。
macの場合のインストール手順を記載します。
# rustのインストール
brew install rust
# typosのインストール
cargo install typos-cli
# バージョンが出力されればOK
typos --version
※ GitHubからバイナリをダウンロードして利用する方法もあります。
コミット時に自動的にtypoを検出する
Git Hooksを利用することで実現しています。
利用したいリポジトリの.git/hooks/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
.git/hooks/pre-commit
に実行権限がない場合は権限を付与してください。
# 実行権限の付与
chmod +x .git/hooks/pre-commit
動作方法
設定が終わったリポジトリでコミットすると自動的に動作します。
これでtypoを含んだコミットを自動的に防ぐことができ、fix: typo
コミットすることはなくなります。
最後に
この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします!
また DeNA 公式 Twitter アカウント @DeNAxTech では、 Blog記事だけでなく色々な勉強会での登壇資料も発信してます。ぜひフォローして下さい!
Follow @DeNAxTech
2022/07/19 追記
この記事の拡張版として、typoをなくす理由と方法について、以下の記事を書きました。
「なぜtypo(スペルミス)がいけないのか?」「typoを仕組みでなくす3つの方法(実装、コミット、プルリクエスト)」について記載しています。
合わせてぜひご覧ください。
2023/06/21 追記
この記事の最終版として、以下の記事を書きました。
検知の仕組みをCSpellに変更しました。
エディタの拡張機能による開発時のチェック、Git HooksによるCommit時のチェック、GitHub ActionsによるPush時(PR上)のチェックの全てをCSpellで統一しているので、共通の設定が利用でき、同じ検知内容となります。
また、導入が楽になるようにしました。
合わせてぜひご覧ください。