Gitのhooksのpre-commitなどを超簡単に使用できるHuskyの使い方

Gitのhooksのpre-commitとは

Gitにはcommit前にファイルをチェックして問題があればコミットを中止にできるpre-commitというファイルがある。

ファイルの場所は.git/hooks/の中にpre-commit.sampleというファイルがあるのでpre-commit.sampleをpre-commitにリネームして中身をシェルスクリプトで書き換える。

例えば.jpgや.pngはコミットするが.gifファイルの場合はコミットを中止したい場合は以下のように記述する。

#!/bin/sh

files=(^.+\.gif$)

fileCheck () {
  local e
  for e in "${@:2}"; do [[ "$1" =~ $e ]] && return 0; done
  return 1
}

for FILE in `git diff --cached --name-status $against -- | cut -c3-`; do
  if fileCheck $FILE "${files[@]}"; then
    echo "$FILE"
    IS_GIF=1
  fi
done

if [ "$IS_GIF" ]; then
  echo ".gifファイルはコミット不可"
  exit 1
fi

Huskyで簡単にpre-commit

Gitを使用するのでgit initを作業するフォルダで実行する。

mkdir husky-sample
cd husky-sample
git init

node_modulesは.gitignoreで除外しておく。.git/hooks/内の.sampleはhuskeyをインストールする際に新しいのが入るのですべて削除する。

Huskyで簡単にpre-commitを行うにはまずHuskeyとlint-stagedをインストールする。

今回はhtmlhintを例に説明するので、こちらもインストール。

npm init -y
npm i -D husky lint-staged htmlhint
touch index.html

index.htmlの中身は以下のようにした。

<!DOCTYPE html>
<html>
<body>
<h1 id="foo">title</h1>
<h2 id="foo">subtitle</h2>
</body>
</html>

以上の作業が完了したら試しにnpx htmlhintを実行してみよう。

idが重複しているのでエラーが表示される。npx htmlhintでidが重複しているのでエラーが表示される

Huskeyの使用設定準備

package.jsonにlint-stagedとhuskeyの指定を追記。

"lint-staged": {
  "*.html": [
    "npx htmlhint"
  ]
},
"husky": {
  "hooks": {
    "pre-commit": "lint-staged"
  }
},

これだけであとはgit commitを実行してエラーが検出された場合はコミットが中止される。

カテゴリーgit