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



>我已经阅读了 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 最佳实践。

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 字符,否则它们将被正确猜到。对于二进制文件,前 8,000 个字节很可能至少包含一个实例。

在大多数情况下,您不需要显式声明文件类型(我认为我从来没有(。实际上,如果遇到问题,只需声明一个特定文件即可。

一般来说,Git 可以很好地检测文件是文本还是二进制文件,因此您可能不需要明确设置任何内容。正如您所指出的,无论如何,设置默认值 * text=auto 都是一个好主意。

但是,如果您或处理该项目的任何人正在使用 UTF-16 文件,那么在这些文件上显式设置 text 属性以及 working-tree-encoding 属性是一个非常好的主意,因为 Git 会注意到其中的 NUL 字节并将其视为二进制。

您还应该将任何文件类型指定为二进制文件,因为您认为可能会被误测为文本。例如,如果你有一些图像格式或文件仅由可打印的 ASCII 字节组成,Git 可能会将其误认为是文本。您需要显式指定这些文件以避免混淆。只有您知道存储库中的哪些文件可能会遇到该问题。

最新更新