text=autoによる行末の正規化
Windows、macOS、Linux開発環境間で行末を自動的に正規化するための.gitattributesの* text=autoディレクティブの使い方を学びます。
Line Endings
詳細な説明
text=autoの役割
* text=autoディレクティブは、あらゆる.gitattributesファイルにおいて最も重要な1行です。Gitに各ファイルがテキストかバイナリかを自動検出するよう指示します。テキストファイルの場合、Gitはリポジトリのオブジェクトデータベースに保存する際に行末をLF(\n)に正規化します。
動作の仕組み
* text=auto
Gitがテキストファイルをインデックス(ステージングエリア)に追加する際、すべての行末をLFに変換します。ファイルをチェックアウトする際、Gitはプラットフォームのネイティブな行末に変換します:
- Windows: LF → CRLF(
\r\n) - macOS / Linux: LFのまま(
\n)
この双方向変換により:
- リポジトリは常に一貫したLF行末でファイルを保存します
- 各開発者は作業ディレクトリでネイティブな行末を確認できます
- diffがクリーンになり、不要な行末変更が表示されません
なぜ重要か
text=autoがない場合、CRLF行末でコミットするWindows開発者と、同じファイルをLF行末で編集するmacOS開発者は、すべての行が変更されたように見えるdiffを生成します。これはコードレビューをほぼ不可能にし、コミット履歴を汚染します。
完全な正規化フロー
| ステージ | Windows | macOS/Linux |
|---|---|---|
| 作業ディレクトリ | CRLF | LF |
git add(インデックスへ) |
LFに変換 | すでにLF |
| リポジトリ(オブジェクト) | LF | LF |
git checkout |
CRLFに変換 | LFのまま |
既存リポジトリへの適用
既存のリポジトリに* text=autoを追加した場合、一度すべてのファイルを再正規化する必要があります:
git add --renormalize .
git commit -m "Normalize line endings"
これにより、追跡されているすべてのファイルが新しい属性で再ステージングされ、今後一貫した行末が保証されます。
ユースケース
異なるOS上の開発者がいるすべてのGitリポジトリは、.gitattributesファイルの最初の行に`* text=auto`を含めるべきです。これはGitの公式ドキュメントからの標準的な推奨事項であり、他のすべてのgitattributesルールの基盤です。