GitのフックスクリプトでUTF-8BOMチェック(Windows)

2 min読了の目安(約2100字TECH技術記事

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')でやっています.