Gitの改行コード差分ノイズを止める — .gitattributes の text=auto と eol の使い分け
「1文字も直していないのにファイル全体が差分になる」——WindowsとmacOS/Linuxが混在するチームでよく起きる。原因はたいてい改行コードだ。Windowsは CRLF(\r\n)、Unix系は LF(\n)が標準で、コミットのたびに改行が入れ替わると差分が壊れ、レビューもマージも荒れる。個人設定の core.autocrlf に任せるとメンバー間でズレるので、リポジトリに .gitattributes を置いて改行を固定する のが本筋だ。
まず text=auto、次に必要な拡張子だけ eol で固定
.gitattributes をリポジトリ直下に置く。基本は次の1行でよい。
1 | |
text=auto は「テキストならコミット時にLFへ正規化する」という宣言だ。チェックアウト時の改行はプラットフォームに合わせて展開される。特定の拡張子で改行を必ず固定したい場合は、eol を明示する。
1 | |
eol=lf / eol=crlf はチェックアウト時の改行まで固定するので、core.autocrlf の個人設定に関係なく全員同じ結果になる。これが core.autocrlf 依存より確実な理由だ。
既存リポジトリは「再正規化」で一括そろえ
.gitattributes を後から入れた場合、既にコミット済みのファイルはそのまま。全ファイルをルールに沿って作り直すには、再正規化を1回かける。
1 | |
--renormalize は現在のルールで全ファイルを正規化し直す。これで以後の改行ノイズが止まる。混在が心配なファイルの現状を確認するなら、git ls-files --eol で各ファイルの working/index の改行状態を一覧できる。
1 | |
単発の変換はツールで済ませる
Gitに載っていない受領ファイルや、一度だけ改行をそろえたいテキストは、コマンドを打つより手元でさっと変換したいこともある。CRLF・LF・CRを相互変換して現在の改行コードも判定できるツールを用意しているので、単発の整形にはこちらが早い。
処理はブラウザ内で完結し、貼り付けたテキストは送信されない。チームで恒常的にそろえるなら .gitattributes、単発なら変換ツール、と使い分けると改行問題に悩まされなくなる。