LoginSignup
1
2

More than 5 years have passed since last update.

gitへのコミット時に文字コードを強制する(UTF-8のBOMを取り除く)

Posted at

JenkinsFile にBOMが付いててこけることがあって、それの対処に使った内容。

TL;DR

  • pre-commit フックで対象ファイルのチェック。
  • コミット対象のファイルを編集して再度 add する。

hookスクリプト

nkf とか file とか awk とかもっと使い勝手いいコマンドで簡単にする方法はあるけど、
WindowsでSourceTree使っていて MinGWにいろいろ入れるの面倒だったので ピュアな環境で使えるようにしたかったので。

pre-commit
#!/bin/bash

gitroot=$(git rev-parse --show-toplevel)                                          # 1
pattern='jenkinsfile|\.gvy$'                                                      # 2

git diff --cached --name-only | egrep -i $pattern | while read file ; do          # 3
  target="$gitroot/$file"
  if [ ! -f $target ] ; then :                                                    # 4
  elif head -1 $target | grep $'\xef\xbb\xbf' > /dev/null ; then                  # 5
    tmp=$target.tmp                                                               # 6
    cp -p $target $tmp
    cat $tmp | perl -ple 's/^\xef\xbb\xbf// if (! $count++)' > $target            # 7
    git add $target                                                               # 8
    rm $tmp -f
  fi
done

内容の説明

  1. git diff はリポジトリのルートからの相対パスが返るので、後でフルパス作れるように。
  2. 処理対象とするファイル名のパターン。今回はJenkinsFileと共有処理書いてるGroovyスクリプトだったのでこの内容で。
  3. コミット対象のファイル = インデックスされているファイル一覧を取得してファイル名フィルタを適用。
  4. ファイルチェック、既存ファイルを削除する変更の場合はこれがないと怒られるので注意。
  5. TF-8のBOMで始まるかチェック。file とか nkf の2.1.3以降使えるならそれで代用できるはず。
  6. いじってそのまま更新かけるので一旦一時ファイル。awk -i 使えれば(ry
  7. 先頭行だけUTF-8を置換、他はそのままファイルに書き出す。
  8. ファイルの内容をインデックスし直す。
    • ファイルの一部をインデックスしている場合も全部コミット対象になるので注意

感想

C#とかやってるとBOM付きも使うから、混在すると面倒だよね _(:3」∠)_
エンジニア全員がソースからのmakeとか抵抗なければ、nkfとかfileとかawkとか使ったほうが絶対きれいになるよねこれ _(:3」∠)_

参考

1
2
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
1
2