我的存储库中有很多旧版 Windows 资源文件 (*.rc)。最初他们有 UTF-8、ASCII、UTF-16 或其他编码。另外,我的存储库中没有 .gitattributes,因此 git 无法为 UTF-16 文件生成 diff 并将它们视为二进制文件。
在我的
dev
分支中,我已将所有 *.rc 文件转换为带有 CRLF 行结尾的 UTF-16LE-BOM,并添加了带有 **/*.rc text working-tree-encoding=UTF-16LE-BOM eol=CRLF
的 .gitattributes。 (我已将所有文件转换为 UTF-16,以便仅使用 *.rc 掩码,而不是显式列出所有文件。)
但是当我克隆我的存储库并尝试
git checkout
到 dev
分支时,我看到很多错误 failed to encode '...' from UTF-8 to UTF-16LE-BOM
,所以看起来 git 将它们视为 UTF-8,无论 .gitattributes 内容如何。此外,签出后所有 *.rc 文件都会损坏。
之前:
#include <winver.h>
// Version Information
#ifndef _DEBUG
之后:
#include <winver.h>
ഀഀ
// Version Information
⌀椀昀渀搀攀昀 开䐀䔀䈀唀䜀ഀഀ
另外,如果我在结账后输入
git status
,git 会显示 failed to encode '...' from UTF-16LE-BOM to UTF-8
。
有什么办法可以解决这个问题吗?
.gitattributes 文件的文档提供了配置 UTF-16 文件工作树编码的示例,这些文件 (1) 具有字节顺序标记 (BOM),或 (2) 缺少字节顺序标记。解释一下:
如果 UTF-16 文件有 BOM,请设置
working-tree-encoding=UTF-16
。 Git 显然会检查 BOM 以区分小端和大端。
如果 UTF-16 文件缺少 BOM,请根据使用的文本编码设置
working-tree-encoding=UTF-16LE
或 working-tree-encoding=UTF-16BE
。
文档中从未提及编码类型
UTF-16LE-BOM
;但是,Git 支持从终端(或 Windows 上的 Git Bash)运行 iconv --list
时可用的编码。 UTF-16LE-BOM
在 Ubuntu 18.04 或 Windows 10 上不显示为受支持的编码。