概要
(とりわけ共有されうる)ソースコードのインデントはスペースで打つのが良いとされている。
ただ、普段タブで打ってしまっている人もいる。タブ派の人に無理にスペースを使わせるのは辛い。というか僕が実のところタブ派なので辛い。
こういうのは git コミット時・チェックアウト時に自動変換されてくれると嬉しい。
変換の方針
いろいろ流儀はあるだろうが、今回は以下のような変換を行う。
コミット時
タブ→4スペース に変換する
チェックアウト時
4スペース→タブ に変換する
事前準備
設定方法
.git/info/attributes を編集
ローカルのリポジトリ内で .git/info/attributes を編集する。
たぶん最初は無いことが多いと思うので、手動で作成する。
中身は以下のような内容とする。変換の対象としたいファイルパターンを列挙していく。
*.java filter=tabspace *.cpp filter=tabspace *.h filter=tabspace
git config する
Linux, Mac の場合
ローカルのリポジトリ内で以下を実行。
(コミット時、タブをスペースに変換) $ git config filter.tabspace.clean "expand --tabs=4" (チェックアウト時、スペースをタブに変換) $ git config filter.tabspace.smudge "unexpand --tabs=4 --first-only"
Windows の場合
Windows には expand と同名コマンドが入っているようで、名前指定だけだとうまくいかない。実行ファイル名をフルパスで指定すれば良い。パスの区切りは「/」にする。
ローカルのリポジトリ内で以下を実行。
(コミット時、タブをスペースに変換) > git config filter.tabspace.clean "'C:/Program Files/Git/usr/bin/expand.exe' --tabs=4" (チェックアウト時、スペースをタブに変換) > git config filter.tabspace.smudge "'C:/Program Files/Git/usr/bin/unexpand.exe' --tabs=4 --first-only"
設定後
手元ではタブインデント、リモートリポジトリではスペースインデント、という状態が実現される。
図だと分かりにくいけど。
また、チェックアウト時には逆の変換が行われるため、他の人がスペースインデントでコミットした内容を、手元ではタブインデントとして閲覧することができたりする。
おまけ
フィルタにさらに sed 挟んで、行末スペースも消してみたりとか。
> git config filter.tabspace.clean "'C:/Program Files (x86)/Gow/bin/expand.exe' --tabs=4 | sed -e 's/[\t ]*$//'"