【问题标题】:Do I really need to specify all binary files in .gitattributes我真的需要在 .gitattributes 中指定所有二进制文件吗
【发布时间】:2019-11-23 14:56:08
【问题描述】:

我读过Git documentation,这表明我可以明确地将某些文件设置为文本,因此它们的行尾会自动更改或作为二进制文件,以确保它们不受影响。

然而,我也读到 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

【问题讨论】:

    标签: git newline core.autocrlf lf


    【解决方案1】:

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

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

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

    【讨论】:

    • 赞成。我怎么知道文件是否被错误地修改以修复文件结尾。我想唯一的方法是它是否已损坏。
    • 如果你添加文件,而当你执行git diff --cached 时 Git 会产生一个差异(而不是“二进制文件…….differ”),那么 Git 会认为它是一个文本文件。如果您认为不应该是这种情况,请为该文件类型添加规则。如果您有现有的存储库,您还可以使用git log -pgit show 查看历史记录。
    【解决方案2】:

    Git 将检查文件的前 8,000 个字节以查看它是否包含 NUL 字符。如果是,则假定该文件是二进制文件。

    来自git's source code

    #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 个字节很可能至少包含一个实例。

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

    【讨论】:

    • PNG 文件被规范化,因为文件头中有两个行分隔符(第一个 DOS,第二个 Unix)。
    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2018-04-30
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多