13

我有一个包含大量 .cs 文件的文件夹。其中一些文件(出于某种原因)被跟踪为二进制文件,并且该git diff命令无法正常使用它们。我尝试将所有这些文件重新保存为 UTF-8 编码,但没有帮助。我尝试更改目录、目录名、文件名和文件扩展名,所有这些都有帮助。

我还尝试修改 .gitattributes 文件以将 *.cs 文件视为非二进制文件,但这对我没有帮助:

*.cs diff=csharp

我需要一种方法将所有这些文件设置为非二进制文件,而无需更改它们的路径或名称。有没有这样的方法?

4

3 回答 3

16

你可以这样做来强制 git 认为它是文本:

 *.cs diff

不过,您需要确保它实际上是文本。 强制 Git 认为您的文件实际上不是文本,这会在各种情况下导致极其糟糕的行为。

您可能还需要设置一些其他属性:

 *.cs diff merge text

该文本对于 EOL 标准化很有用。如果 Git 在合并时仍然认为文件是二进制文件,您可能需要合并。

然而,真正的问题是“为什么 Git 将我的文件标记为二进制文件?” 答案是因为它在文件的前 8000 个字符中的某处看到了 NUL (0) 字节。通常,这是因为文件被保存为 UTF-8 以外的其他内容。因此,它很可能被保存为 UCS-2、UCS-4、UTF-16 或 UTF-32。在使用 ASCII 字符时,所有这些都嵌入了 NUL 字符。因此,虽然您的问题说您确实将文件重新保存为 UTF-8,但您可能需要使用十六进制编辑器再次检查。我怀疑它们不是 UTF-8,这是问题的核心。

于 2013-11-01T08:35:38.457 回答
1

使用 Notpad++ 更改编码,而不是使用字节顺序标记 (BOM) 的编码。目前,git 将这些顶级 BOM 字符 ( \0xFF\0xFE) 视为二进制文件的开头。

Notepad++ 编码菜单

于 2021-01-29T00:12:14.503 回答
0

在 Sourcetree 3.1.2 版中:

  • 工具 > 选项 > 差异
  • 在“大小限制(文本)”中添加一个额外的零
  • 向“大小限制(二进制)”添加一个额外的零
  • 点击确定
  • 查看 > 刷新(或 F5)
于 2019-10-28T15:08:56.983 回答