まだtypoで消耗してるの? ― typoで悲しい思いをする機会を減らす方法


typoしてますか?

私はしょっちゅうしてます。confitionsとかenalbeとか。
デバッグしていて動かない原因がtypoだったときのくやしさといったら... typoを含んだコミットをプッシュしてしまったときの恥ずかしさといったら...

そんな悲しい思いをする機会を減らす方法を紹介します。

pre-commitフックを活用しよう

typoするときって大抵同じ間違いを繰り返してしまいませんか? 私の場合は冒頭のconfitionsとかenalbeをしょっちゅうやってしまいます。そのような文字列をGitのpre-commitフックを使ってコミットする直前にファイルに中に含まれていないかをチェックさせます。

.git/hooks/pre-commitの設定

Gitリポジトリをクローンしたディレクトリ以下に.git/hooks/pre-commitというスクリプトファイルを作成して実行権を付けておくと、コミットする直前に実行してくれます。このスクリプトがステータス0で終了したらコミットOK、ステータス0以外で終了したらコミットNGとなります。

.git/hooks/pre-commitがなかった場合は、.git/hooks/pre-commit.sampleをコピーしましょう。そして、下記を追記してください。

.git/hooks/pre-commit
...

allow_typo_error=$(git config hooks.allowtypoerror)
typo_regexp=$(git config hooks.typoregexp)

if [ "$allow_typo_error" != "true" -a -n "$typo_regexp" ]
then
    for FILE in $(git diff-index --name-status --cached $against -- | cut -c3-) ; do
    has_typo_error=$(egrep --color=always -na $typo_regexp $FILE)
    if [ $? -eq 0 ]; then
        echo
        echo
        echo "Typo has detected in $FILE"
        echo "$has_typo_error"
        echo
        echo "If you know what you are doing you can disable this check using:"
        echo
        echo "  git config hooks.allowtypoerror true"
        echo
        exit 1
    fi
    done
fi

使い方

いつも自分が間違えてしまう文字列を下記のコマンドを実行して登録しておきます。スクリプト中ではegrepを使っていますので正規表現を利用可能です。

$ git config hooks.typoregexp "enalbe|confition|tackel|mesage|isntall|lamdba|unlick|unkown"
  • 2016/09/16 typoリスト追加 (T_T
  • 2017/06/09 typoリスト追加 (うんこぅん)

あとは普通にコミットするだけ。
コミットしようとするファイルに登録した文字列が含まれていた場合、下記のような警告が表示されコミットが中止されます。

なんらかの理由で一時的にtypoチェックを無効にして強制的にコミットしたい場合は、下記のコマンドを実行してください。(ブランチマージをしようとしていてtypoチェックに引っ掛かった場合など。明らかに間違いだとわかりますが一旦マージはそのまま終わらせて、そのあと改めて修正コミットをいれるとよいでしょう。)

$ git config hooks.allowtypoerror true

おわりに

Gitのpre-commitフックを利用して、typoチェックをする方法を紹介しました。

この方法は、私自身が何度も何度も同じ間違いを繰り返してしまっており、ヒドイ時には検証工程までいってからの戻りにもなってしまっていたため、再発防止策として導入しました。

test - エンジニアなら知っておきたい障害報告&再発防止策の考え方 - Qiita ← こちらの記事によれば、良い再発防止策には下記のものがあるそうです。

  1. その種類の問題について二度と意識することがなくなる解決策
  2. その種類の問題を開発時に自動的に検知することができる解決策
  3. その種類の問題が発生しても自動的に復旧することができる解決策
  4. その種類の問題が発生しても影響が局所化される、フールプルーフ、フェールセーフになる解決策

今回の方法は2つ目の「問題を自動的に検知」に該当します。常にtypoしないようにと気を張り続けるのではなく、typoしたってちゃんと検知できるからいいんだ!と思うと少しだけ普段の作業効率が上がったような気がします。(ほんとにちょっとだけね。)

一度でもtypoをしてしまった場合は、その文字列を随時登録するようにして、二度と同じ間違いをしないようにしましょう。