我知道 Git 会以某种方式自动检测文件是二进制文件还是文本文件,如果需要,可以使用 .gitattributes
手动设置它。但是还有一种方法可以询问 Git 如何处理文件吗?
假设我有一个包含两个文件的 Git 存储库:一个包含纯文本的 ascii.dat
文件和一个包含随机二进制内容的 binary.dat
文件. Git 将第一个 .dat
文件作为文本处理,将第二个文件作为二进制文件处理。现在我想写一个 Git web 前端,它有一个文本文件查看器和一个特殊的二进制文件查看器(例如显示十六进制转储)。当然,我可以实现自己的文本/二进制检查,但如果查看者依赖于 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
的字符串,您应该很熟悉。
关于git - 如何确定 Git 是将文件处理为二进制文件还是文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119956/