How to determine if Git handles a file as binary or as text?
builtin_diff()
1 calls diff_filespec_is_binary()
which calls buffer_is_binary()
which checks for any occurrence of a zero byte (NUL “character”) in the first 8000 bytes (or the entire length if shorter).
I do not see that this “is it binary?” test is explicitly exposed in any command though.
git merge-file
directly uses buffer_is_binary()
, so you may be able to make use of it:
git merge-file /dev/null /dev/null file-to-test
It seems to produce the error message like error: Cannot merge binary files: file-to-test
and yields an exit status of 255 when given a binary file. I am not sure I would want to rely on this behavior though.
Maybe git diff --numstat
would be more reliable:
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
For binary files, the --numstat
output should start with -
TAB -
TAB, so we just test for that.
1builtin_diff()
has strings like Binary files %s and %s differ
that should be familiar.
git grep -I --name-only --untracked -e . -- ascii.dat binary.dat ...
will return the names of files that git interprets as text files.
The trick here is in these two git grep parameters:
-
-I
: Don’t match the pattern in binary files. -
-e .
: Regular expression match any character in the file
You can use wildcards e.g.
git grep -I --name-only --untracked -e . -- *.ps1