git diffを美しく

新幹線でぼーっとしている時間を有効活用すべく、新幹線Wifiを駆使して調べました。

目的
  • 的確に差分を表示できるようにgit commitしたい。
  • 文字コード、改行コード、行末スペースの差分でリポジトリをよごしたくない。
処置案1

コミット前にスクリプトで処置します。コミットする人が私一人ならこれでいいです。

# 1. テキストファイルをリストアップし、UTF-8/LF改行に変換して上書き
find . -type f -not -path "*/.git/*" | perl -nle 'print if -f && -T' | xargs nkf -w -Lu --overwrite

# 2a. 行末に空白のあるテキストファイルをリストアップし、処置して上書き
find . -type f -not -path "*/.git/*" | perl -nle 'print if -f && -T' | xargs grep -lzP "\ \n" | xargs sed -i 's/\ *$//'

# 2b. 末尾Tabもあわせて削除(sedで、SpaceとTabは'\s'で表現できる)
find . -type f -not -path "*/.git/*" | perl -nle 'print if -f && -T' | xargs grep -lzP "\t\n|\ \n" | xargs sed -i 's/\s*$//'

# 2c. README.mdなどのMarkdownは末尾空白2個で改行なので除外する場合
find . -type f -not -path "*/.git/*" -not -name '*.md' | perl -nle 'print if -f && -T' | xargs grep -lzP "\t\n|\ \n" | xargs sed -i 's/\s*$//'

[3/25] grep -lzP "\t\n|\ \n"に修正しました。

処置案2

pre-commit hookを使うと、コミット前に処置できるようです。複数の人がコミットするなら、ここで処置すべきです。余力があれば帰りの新幹線で。。。寝てました (-_-;)

処置案3

既に行末スペース等でよごれてしまったリポジトリは、表示の際のオプション設定できれいにdiff表示できます。

git diff -w

GitHubWebブラウザでdiff表示している時も、URL末尾に「?w=1」を付ければ機能します。
備考:GitHubの秘密


次の新幹線テーマ
  • 1行スクリプト・・・つまり「ワンライナー」を目指したいのですが、意外と難しいのです。
  • Subversionの#Date, #Revisionのように、gitでもテキストファイルに日付とリビジョンを埋め込みたいです。post-checkoutとpre-commitで対応でしょうか?