我需要指定所有的二进制文件在.gitattributes文件中吗?

18
我读过Git文档,其中提到可以明确设置某些文件为文本,以便自动更改它们的行结尾或者将其设置为二进制,以确保不受影响。
然而,我也读到Git能够很好地检测二进制文件,这让我认为这并不是必需的。所以我的问题是,我是否真的需要为我的存储库中的每个文件扩展名指定这些显式设置?我看到有一些建议对所有图像文件扩展名都这样做。
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

感谢大家的回答,我已经写了一篇博客文章:.gitattributes最佳实践

2个回答

20

Git会检查文件的前8,000个字节,以查看是否包含NUL字符。如果有,就认为该文件是二进制文件。

来自git源代码

#define FIRST_FEW_BYTES 8000
int buffer_is_binary(const char *ptr, unsigned long size)
{
    if (FIRST_FEW_BYTES < size)
        size = FIRST_FEW_BYTES;
    return !!memchr(ptr, 0, size);
}

对于文本文件而言,除非你有意出于某些原因插入了一个NUL字符,否则它们会被正确猜测。对于二进制文件而言,前8000个字节很可能至少包含一个实例。

大多数情况下,你不需要显式地声明文件类型(我想我从来没有这样做过)。实际上,如果遇到问题,只需声明特定的文件即可。


PNG文件被规范化是因为文件头中有两个行分隔符(第一个是DOS,第二个是Unix)。 - bjmi

4

通常情况下,Git能够很好地检测出文件是文本还是二进制的,因此您可能不需要明确设置任何内容。无论如何,将默认值设置为* text=auto 是一个好主意,正如您所指出的一样。

但是,如果您或者任何参与项目的人在使用UTF-16格式的文件,则明确设置这些文件的text属性以及working-tree-encoding属性是一个非常好的主意,因为Git会注意到其中的NUL字节并将其视为二进制文件。

您还应该将您认为可能被错误地检测为文本的任何文件类型指定为二进制。例如,如果您有一些只包含可打印ASCII字节的图像格式或文件,Git可能会将其误检为文本。您需要明确指定这些文件以避免混淆。只有您才知道仓库中哪些文件可能会遇到这个问题。


赞同。我如何知道文件是否被错误地修改以修复文件结尾?我想唯一的方法是检查它是否已损坏。 - Muhammad Rehan Saeed
1
如果您添加了文件,并且在执行 git diff --cached 命令时 Git 生成了差异(而不是“Binary files….differ”),那么 Git 认为它是一个文本文件。如果您认为这不应该是这种情况,则可以为该文件类型添加规则。如果您有现有的存储库,还可以使用 git log -pgit show 查看历史记录。 - bk2204

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接