Git でバイナリ扱いのファイルの text diff を見る方法
Git においてバイナリファイルとして設定されているファイルの text diff を見る方法についてです。
確認時のバージョン
- Git 2.37.1
結論: --text
オプションを付ける
git show
や git diff
のコマンド実行時に --text
オプションをつければ OK です。
git show --text
git diff --text
以下補足メモです。
Git のバイナリ or テキストの扱い
Git は通常ファイルの中身の先頭を見てテキストかバイナリかの推測を自動で行います。
この推測をさせずに強制的にテキストかバイナリかを指定したいときには、設定ファイル .gitattributes
を使用します。
.gitattributes
:
dist/** binary
binary
と指定されたファイルは Git によりバイナリファイルとして扱われます(このサンプルの場合、 dist/
ディレクトリ以下のファイルがバイナリ扱いになります)。
なお、 .gitattributes
における binary
はマクロ属性( macro attribute )と呼ばれるもので、 binary
ひとつで次の 3 つの属性を指定したのと同じ意味になるそうです:
-diff -merge -text
以下それぞれの意味合いです:
-diff
: text diff 表示を無効化-merge
: コンフリクト発生時のファイル内のマージ処理を無効化-text
: 改行文字の標準化を無効化
バイナリファイルの text diff を見る方法
上述のとおり、 .gitattributes
で binary
(もしくは -diff
)指定されたファイルは git show
や git diff
の実行時に text diff が表示されません。
代わりに次のような説明文が出力されます:
Binary files a/x.txt and b/x.txt differ
この設定を上書きし強制的に text diff を見たいときは、冒頭の結論のとおり --text
オプションをつければ OK です。
git show --text
git diff --text
--text
の代わりに -a
を使っても大丈夫です。
-a, --text
Treat all files as text.
ただし、厳密に正確な説明ではないので、詳細は Git 公式ドキュメントを参照してください。
参考
- Git - gitattributes Documentation
- 8.2 Customizing Git - Git Attributes | Git Book
- Override git's choice of binary file to text - Stack Overflow
おまけ: バイナリ or テキストの推定をテストする方法
この方法がベストかどうかは不明ですが、 Git がファイルをバイナリ or テキストのどちらと推定するかをチェックする方法が Stack Overflow で紹介されていました:
git diff --no-index --numstat /dev/null [対象ファイル]
このコマンドは「追加行数」「削除行数」「ファイルの変更」の 3 つの情報を出力します。
推定結果がテキストの場合は「追加行数」「削除行数」が数値になります。
他方、バイナリの場合は「追加行数」「削除行数」が -
になります(加えて、バイナリの場合はリターンコードが 1
になります)。
# テキストの場合:
158 0 /dev/null => path/to/file
# バイナリの場合:
- - /dev/null => path/to/file