Gitフックの『pre-commit』で意図しない文字コードのコミットを防ぎます。
Gitが入っていれば恐らく意識せずとも使えるようになっているであろうBashで書いています。
pre-commitを配置する
対象リポジトリの.git/hooks
ディレクトリに以下の様な『pre-commit』ファイルを作成し配置します。
hooks
ディレクトリがない場合は作成します。
『pre-commit』はcommit前に起動してスクリプトを実行してくれます。
# !/bin/bash
type="text/"
charset="charset=utf-8"
for L in `git diff --cached --name-only HEAD`
do
if [[ `file -ib $L | grep $type` ]] && [[ ! `file -ib $L | grep $charset` ]]; then
msg+="$L の文字コードをUTF-8にしてください。\n"
fi
done
if [ -n "$msg" ]; then
echo "!!!コミットエラー!!!"
echo -e "$msg"
exit 1
fi
上記はUTF-8のみコミットを許可したい場合の例です。
許可したい文字コードに合わせてcharsetとメッセージを修正してください。
スクリプトの説明
前提
文字コードのチェックはfileコマンドで行います。
nkfコマンドはインストールされてない事も多く、fileコマンドだとGit Bashでも使えるので。
文字コードを自動変換したい場合はnkfコマンドを使いましょう。
コミットを許可する文字コードの設定
type="text/"
charset="charset=utf-8"
mimeタイプがtextのファイルをチェック対象にします。
上記はUTF-8のみ許可します。
コミットファイルの数だけループする
for L in `git diff --cached --name-only HEAD`
do
done
git diff --cached --name-only HEAD
コマンドを使い、indexとHEADの差分ファイルをループでチェックします。
fileコマンドで文字コードをチェックする
if [[ `file -ib $L | grep $type` ]] && [[ ! `file -ib $L | grep $charset` ]]; then
msg+="$L の文字コードをUTF-8にしてください。\n"
fi
file -ib
コマンドを使い、ファイルのmimeタイプと文字コードを判定します。
許可したい文字コード以外のファイルをメッセージに詰めます。
メッセージを表示してエラー終了
if [ -n "$msg" ]; then
echo "!!!コミットエラー!!!"
echo -e "$msg"
exit 1
fi
チェックに引っかかったファイルがあれば表示して、コミットせずにエラー終了とします。