Git でバイナリ扱いのファイルの text diff を見る方法
Git においてバイナリファイルとして設定されているファイルの text diff を見る方法についてです。
確認時のバージョン
- Git 2.37.1
結論: --text オプションを付ける
git show や git diff のコマンド実行時に --text オプションをつければ OK です。
git show --textgit diff --text以下補足メモです。
Git のバイナリ or テキストの扱い
Git は通常ファイルの中身の先頭を見てテキストかバイナリかの推測を自動で行います。
この推測をさせずに強制的にテキストかバイナリかを指定したいときには、設定ファイル .gitattributes を使用します。
.gitattributes:
dist/** binarybinary と指定されたファイルは 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 --textgit 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