
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が重複しているのでエラーが表示される。
Huskeyの使用設定準備
package.jsonにlint-stagedとhuskeyの指定を追記。
"lint-staged": { "*.html": [ "npx htmlhint" ] }, "husky": { "hooks": { "pre-commit": "lint-staged" } },
これだけであとはgit commitを実行してエラーが検出された場合はコミットが中止される。