読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

gitコミット時・チェックアウト時にインデントのタブ・スペース変換を行う

Git

概要

(とりわけ共有されうる)ソースコードのインデントはスペースで打つのが良いとされている。

ただ、普段タブで打ってしまっている人もいる。タブ派の人に無理にスペースを使わせるのは辛い。というか僕が実のところタブ派なので辛い。

こういうのは git コミット時・チェックアウト時に自動変換されてくれると嬉しい。

変換の方針

いろいろ流儀はあるだろうが、今回は以下のような変換を行う。

コミット時

タブ→4スペース に変換する

チェックアウト時

4スペース→タブ に変換する

事前準備

expand/unexpand を実行できるようにしておく

  • Linux の場合、最初から使える気がする。coreutils に含まれているようである。
  • Mac の場合、brew install coreutils とかすれば良いらしい。
  • Windows の場合、Cygwin とか Gow とかを使えば良い。僕は Gow を使っている。

設定方法

.git/info/attributes を編集

ローカルのリポジトリ内で .git/info/attributes を編集する。
たぶん最初は無いことが多いと思うので、手動で作成する。

中身は以下のような内容とする。変換の対象としたいファイルパターンを列挙していく。

*.java  filter=tabspace
*.cpp   filter=tabspace
*.h     filter=tabspace

git config する

Linux, Mac の場合

ローカルのリポジトリ内で以下を実行。

$ git config filter.tabspace.smudge "unexpand --tabs=4 --first-only"
$ git config filter.tabspace.clean "expand --tabs=4"
Windows の場合

Windows には expand と同名コマンドが入っているようで、名前指定だけだとうまくいかない。実行ファイル名をフルパスで指定すれば良い。パスの区切りは「/」にする。

ローカルのリポジトリ内で以下を実行。

> git config filter.tabspace.smudge "'C:/Program Files (x86)/Gow/bin/unexpand.exe' --tabs=4 --first-only"
> git config filter.tabspace.clean "'C:/Program Files (x86)/Gow/bin/expand.exe' --tabs=4"

設定後

手元ではタブインデント、リモートリポジトリではスペースインデント、という状態が実現される。
図だと分かりにくいけど。

f:id:kobake:20150323225209p:plain

また、チェックアウト時には逆の変換が行われるため、他の人がスペースインデントでコミットした内容を、手元ではタブインデントとして閲覧することができたりする。

おまけ

フィルタにさらに sed 挟んで、行末スペースも消してみたりとか。

> git config filter.tabspace.clean "'C:/Program Files (x86)/Gow/bin/expand.exe' --tabs=4 | sed -e 's/[\t ]*$//'"
});