改行コード LF・CR・CRLF の違いと Git 警告の意味
テキストファイルには「行の終わり」を示す不可視の制御文字が存在する。LF(Unix系)・CR(旧Mac)・CRLF(Windows)の3種が混在すると、チーム開発でさまざまな不具合を引き起こす。
3種の改行コード
改行コードには LF(16進数表記で 0x0A)、CR(0x0D)、CRLF(0x0D 0x0A)の3種類がある。LF は Unix・Linux・現代の macOS で使われ、CR は Classic Mac OS(OS 9以前)で使われていた。CRLF は Windows が使う方式である。これらの名前はタイプライターの動作に由来する。CR(キャリッジリターン)は印字ヘッドを行頭へ戻す動作、LF(ラインフィード)は紙を1行分送る動作を指す。
混在すると起きる問題
改行コードが混在すると、内容が同一でも Git の差分(diff =変更箇所の比較表示)が全行変更として表示されてしまう。また、Windows で編集したシェルスクリプトに CR が残ったまま Linux サーバーに置くと、構文エラーを起こすことがある。LF 前提のアプリで CRLF ファイルを開くと、改行が認識されず全体が1行に見えてしまう場合もある。
Git の警告「LF will be replaced by CRLF」
この警告は core.autocrlf(=改行コードを自動変換する Git の設定項目)が true になっている時に表示される。true に設定すると、コミット時に CRLF から LF へ、チェックアウト時に LF から CRLF へ自動変換される(Windows で推奨される設定)。input に設定すると、コミット時のみ CRLF から LF へ変換する(Linux・Mac で推奨される設定)。警告自体は無害だが、放置するとチーム内で意図しない差分を生む可能性があるため、改行コードの統一が望ましい。
推奨:.gitattributes で明示的に統一
.gitattributes(=リポジトリ単位でファイルの扱いを指定する設定ファイル)をリポジトリのルートに置くことで、改行コードをリポジトリ単位で固定できる。* text=auto eol=lf と設定すれば、テキストファイルをすべて LF に統一できる。この設定は開発者個人の core.autocrlf 設定を上書きする。Windows のエディタは内部表示を CRLF のままにできるため、この統一による実害はほぼない。
.gitattributes に eol=lf を1行追加するだけで、OS混在チームの改行コード問題を根絶できる。