11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gitでコミットする前に文字コードをチェックする(pre-commit)

Posted at

Gitフックの『pre-commit』で意図しない文字コードのコミットを防ぎます。
Gitが入っていれば恐らく意識せずとも使えるようになっているであろうBashで書いています。

pre-commitを配置する

対象リポジトリの.git/hooksディレクトリに以下の様な『pre-commit』ファイルを作成し配置します。
hooksディレクトリがない場合は作成します。
『pre-commit』はcommit前に起動してスクリプトを実行してくれます。

pre-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

チェックに引っかかったファイルがあれば表示して、コミットせずにエラー終了とします。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?