git - 如何确定 Git 是将文件处理为二进制文件还是文本文件?

标签 git

我知道 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/

相关文章:

git - svn2git 的 --svn-branches 参数的优缺点是什么

git - 使用 "theirs"选项解决 merge 冲突(有利于 merge 分支)

git - 如何推送到 Gitlab 上的远程 git 分支?

git - 奇怪的git merge 问题

git - 使用一个存储库作为其他存储库的基础

git - 如何使用 dvc 工作流程添加/更新数据?

git - 如何正确忽略 GitHub 中的文件夹?

Git stash 删除添加的更改

git - git clone gitosis@host :gitosis-admin. git 的密码问题

git - 'git status' 显示要提交的更改,但 'git push origin master' 表示 'Everything up-to-date'