GitのフックスクリプトでUTF-8BOMチェック(Windows)
Gitのフックスクリプトを使ってコミット時にエンコーディングがUTF-8BOMかどうかチェックして,そうでないならコミット失敗にする方法です.今更な内容ですが,備忘録として残しておきます.
やりたいことは次の3つです.
- チェックする対象を制御できる
- フックスクリプトを他の人の環境と同じにしてバージョン管理下におきたい
- UTF-8 BOM チェック
チェックする対象を制御できる
.gitattributes
で制御します.このファイルにチェックするファイルを指定します.
以下を参考にさせてもらいました.
私の場合は次のように記述しました.
[attr]bomcheck encoding=utf-8,utf-8-bom
*.c bomcheck
*.h bomcheck
*.cpp bomcheck
*.hpp bomcheck
特定のフォルダ以下だけを指定したい場合,例えばsource
以下の場合は
[attr]bomcheck encoding=utf-8,utf-8-bom
source/*.c bomcheck
source/*.h bomcheck
source/*.cpp bomcheck
source/*.hpp bomcheck
サブフォルダ以下も対象にしたい場合は
[attr]bomcheck encoding=utf-8,utf-8-bom
source/**/*.c bomcheck
source/**/*.h bomcheck
source/**/*.cpp bomcheck
source/**/*.hpp bomcheck
とします.
フックスクリプトを他の人の環境と同じにしてバージョン管理下におきたい
custom_hooks
というフォルダを作ってそこにフックスクリプトを入れます.そして,custom_hooks
フォルダをバージョン管理して,他の人でも取得できるようにします.
次に,フックスクリプトは .git/hooks
を見にいくのでこれを変更する必要があります.
git config core.hooksPath ./custom_hooks
一度設定すれば,custom_hooks
にあるフックスクリプトを更新することで他の人にも反映させることができます.別にcustom_hooks
という名前である必要はありません.
UTF-8 BOM チェック
以上の設定をもとにフックスクリプトを作成します.Git Bashを使います.
custom_hooks/pre-commit
#!C:/Program\ Files/Git/usr/bin/sh.exe
CHANGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
FILES=$(echo $CHANGED_FILES | xargs git check-attr encoding | grep 'utf-8-bom' | sed -e 's/: encoding: utf-8,utf-8-bom//')
for FILE in $FILES; do
if [[ ! $(file $FILE | grep 'with BOM') ]]; then
result+=`file $FILE`
fi
done
if [ -n "$result" ]; then
echo "エンコーディングを UTF-8 BOM に変更してください"
echo -e "$result"
exit 1
fi
git diff --cached --name-only --diff-filter=ACM
でコミットファイルを取得し,git check-attr encoding
で.gitattributesで設定したencodingを取得します.指定していれば,そのencodingが,指定していなければencodingはunspecified
が得られます.それをgrep 'utf-8-bom'
にしてチェックし,sed -e 's/: encoding: utf-8,utf-8-bom//'
でファイルの部分だけ取り出します.実際のUTF-8 BOMチェックは$(file $FILE | grep 'with BOM')
でやっています.
Discussion