Git でバイナリ扱いのファイルの text diff を見る方法

Git

Git においてバイナリファイルとして設定されているファイルの text diff を見る方法についてです。

確認時のバージョン

  • Git 2.37.1

結論: --text オプションを付ける

git showgit 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 を見る方法

上述のとおり、 .gitattributesbinary (もしくは -diff )指定されたファイルは git showgit 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 公式ドキュメントを参照してください。

参考

おまけ: バイナリ 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

参考


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら