.gitattributesでバイナリファイルをマークする

画像、フォント、コンパイル済みアセットなどのバイナリファイルを正しく識別し、行末正規化中のGitによる破損を防ぐための.gitattributesの設定方法。

Binary Files

詳細な説明

バイナリファイルに明示的なマーキングが必要な理由

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プロジェクト、メディアファイルを含むゲーム開発プロジェクト、および自動検出されるファイルタイプを使用するプロジェクトで特に重要です。

試してみる — .gitattributes Generator

フルツールを開く