特定のエンコーディングでコミットされていないファイルを拒否できる git または svn の precommit フックを作成することは可能ですか?
特定のファイルエンコーディング(たとえばUTF-8など)に固執することが問題であると思われるいくつかのプロジェクトに取り組んできました
特定のエンコーディングでコミットされていないファイルを拒否できる git または svn の precommit フックを作成することは可能ですか?
特定のファイルエンコーディング(たとえばUTF-8など)に固執することが問題であると思われるいくつかのプロジェクトに取り組んできました
あなたのiconvは、何かがUTF-8でないかどうかを教えてくれるかもしれませんが、他のエンコーディングはそれほど簡単ではないかもしれません(特にISO-8859-1のような8ビットのシングルバイトエンコーディング)。
Git の場合、pre-commit フックの代わりに update フックが実際に必要になる場合があります (中央リポジトリで実行してルールを適用できるようにするため)。
Git プリコミット フック:
#!/bin/sh
git ls-files -z -- |
xargs -0 sh -c '
e=""
for f; do
if ! git show :"$f" |
iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then
e=1
echo "Not UTF-8: $f"
#exit 255 # to abort after first non-UTF-8 file
fi
done
test -z "$e"
' -
--
チェックされるパス名を制限するには、git ls-filesコマンド ラインの の後に 1 つ以上の Git パススペックを入力します。
更新フックで更新された ref の先端を確認するには、を使用git ls-tree --name-only -r -z $3 -- |
してパス名を生成し (注: git ls-filesのようなパターン パス仕様を処理しないため、シェル コードでパターンベースのフィルタリングを行います) git show "$3:$f"
、ファイルを抽出します。コンテンツ。git rev-list ^$2 $3
また、ヒント コミットだけでなく、新しいコミットごとにチェックすることもできます (単に ではなく、各コミットをループします$3
)。
Precommit フックは単なるスクリプトです。したがって、スクリプトでエンコーディングを知ることができれば、その情報を使用して間違った種類のファイルを拒否できます。
通常の文字範囲外の文字をファイルで検索できます。ファイルのエンコーディングを示すマジック ナンバーまたはタグがある場合は、それを確認できます。それ以外の場合は、「このファイルのエンコーディングが間違っていることをどうやって知ることができるでしょうか?」と自問してください。それをコーディングできますか?
iconvユーティリティを使用して、エンコーディングを UTF-8 から UTF-16 などに変更できます。変更が失敗した場合は、ソース ファイルのエンコーディングが正しくありません。
$ iconv -f UTF-8 -t UTF-16 Strings.java
ÿþ
testing = iconv: illegal input sequence at position 11