1. ホーム
  2. git

[解決済み] Git がファイルをバイナリとして扱うかテキストとして扱うかを判断するには?

2023-04-13 08:08:57

質問

Git が、ファイルがバイナリかテキストかを自動的に判別することは知っています。 .gitattributes を使って手動で設定することができるのは知っています。しかし、ファイルをどう扱うかをGitに尋ねる方法はあるのでしょうか?

例えば、2つのファイルを含むGitリポジトリがあるとします。An ascii.dat ファイルで、プレーンテキストと binary.dat ファイルにはランダムなバイナリが含まれています。Gitは、最初の .dat ファイルをテキストとして扱い、2番目のファイルをバイナリとして扱います。さて、私はテキストファイル用のビューアとバイナリファイル用の特別なビューア(例えば16進ダンプを表示する)を持つGitウェブフロントエンドを書きたいと思っています。もちろん、私自身のテキスト/バイナリ・チェックを実装することはできますが、ビューアがGitがこれらのファイルをどのように扱うかの情報に依存する方がより便利でしょう。

では、ファイルをテキストとして扱うかバイナリとして扱うかをGitに尋ねるにはどうすればよいのでしょうか?

どのように解決するのですか?

builtin_diff() 1 コール diff_filespec_is_binary() を呼び出す buffer_is_binary() を呼び出し、最初の 8000 バイト (短い場合は全長) の中にゼロバイト (NUL "文字") があるかどうかをチェックします。

私は、この「バイナリかどうか」テストが、どのコマンドでも明示的に公開されていることを知りません。

git merge-file は直接 buffer_is_binary() を使うので、それを利用することができるかもしれません。

git merge-file /dev/null /dev/null file-to-test

のようなエラーメッセージが表示されるようです。 error: Cannot merge binary files: file-to-test のようなエラーメッセージが表示され、バイナリファイルが与えられると255の終了ステータスが出力されるようです。しかし、私はこの動作に依存したいかどうか確信が持てません。

もしかしたら git diff --numstat の方が信頼できるかもしれません。

isBinary() {
    p=$(printf '%s\t-\t' -)
    t=$(git diff --no-index --numstat /dev/null "$1")
    case "$t" in "$p"*) return 0 ;; esac
    return 1
}
isBinary file-to-test && echo binary || echo not binary

バイナリファイルの場合は --numstat で始まる出力でなければなりません。 - TAB - TAB、だから我々はそれをテストするだけです。


1 builtin_diff() のような文字列は Binary files %s and %s differ のような文字列があり、見覚えがあるはずです。