.gitattributesでバイナリファイルをマークする
画像、フォント、コンパイル済みアセットなどのバイナリファイルを正しく識別し、行末正規化中のGitによる破損を防ぐための.gitattributesの設定方法。
詳細な説明
バイナリファイルに明示的なマーキングが必要な理由
Gitの自動検出(text=auto)は通常、テキストとバイナリファイルの区別に優れていますが、バイナリファイルをテキストとして誤認識する場合があります。これが発生すると、Gitの行末正規化がCRやLF文字に一致するバイト列を変更し、ファイルを破損させます。
binary属性
# 画像
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.webp binary
*.svg text
# フォント
*.woff binary
*.woff2 binary
*.ttf binary
*.eot binary
*.otf binary
# アーカイブ
*.zip binary
*.gz binary
*.tar binary
*.7z binary
# コンパイル済み
*.exe binary
*.dll binary
*.so binary
*.dylib binary
binary属性は-text -diff -mergeに展開されるマクロです:
| 属性 | 効果 |
|---|---|
-text |
行末の正規化なし |
-diff |
テキストdiff出力なし(「Binary files differ」と表示) |
-merge |
3ウェイマージなし(常にコンフリクト) |
SVG:特殊なケース
SVGファイルはXMLベースのためテキストであり、バイナリではありません。textとしてマークすることで、Gitが行末を正規化し、意味のあるdiffを生成できます。ただし、SVGが自動生成されて非常に大きい場合は、text -diffを使用して行末は正規化しつつ、ノイズの多いdiffを抑制できます。
フォントとWebアセット
Webフォント形式(WOFF、WOFF2、TTF、EOT、OTF)はバイナリデータであり、Gitの正規化によって変更されてはいけません。これらの取り扱いを誤ると、ブラウザでレンダリングできない壊れたフォントが生じます。
大きなバイナリファイル
多数の、または大きなバイナリファイルを含むリポジトリでは、直接保存する代わりにGit LFS(Large File Storage)の使用を検討してください。その場合、.gitattributesのエントリは次のようになります:
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text
ユースケース
画像、フォント、コンパイル済みバイナリ、またはアーカイブファイルを含むすべてのリポジトリは、それらを明示的にバイナリとしてマークする必要があります。これは、アセットパイプラインを持つWebプロジェクト、メディアファイルを含むゲーム開発プロジェクト、および自動検出されるファイルタイプを使用するプロジェクトで特に重要です。