Git不能使用utf-16编码进行diff或merge .cs文件

use*_*789 7 c# git utf

我和朋友同时在同一个.cs文件上工作,当有合并冲突时,git指出存在冲突,但文件没有加载通常的"HEAD"">>>"因为.cs文件是二进制文件.所以我们在我们的.gitattributes文件中添加了很多东西(*.cs文本等) - 使git将它视为一个无效的文本文件.

多数民众赞成当我们意识到git可以区分其他.cs文件而不是这个.原因是因为它包含一些中文字符,因此在unicode编码中.

那么我们如何制作git diff或合并utf-16或utf-8格式的文件呢?

如果我推动,gitlab会显示出不同的东西.所以我不知道git如何在服务器上区分,而不是bash.

Imr*_*ron 4

我对 C++ 项目的 *.rc 文件有类似的问题,发现解决这个问题的最佳方法是使用 git 的 smudge 和 clean 过滤器将存储库中的所有内容存储为 utf-8,然后在写入时转换为 utf-16到工作目录。

这样,git 所做的一切(例如差异、合并或任何其他操作)都可以在 utf8 文本上正常工作,但您的工作副本将具有 utf16,这将使 Visual Studio 满意。

要配置它,请确保您使用的 git 版本具有 iconv 可用(最新版本的 msysgit 具有)并将以下内容添加到 ~/.gitconfig 文件中:

[filter "utf16"]
    clean = iconv -f utf-16le -t utf-8
    smudge = iconv -f utf-8 -t utf-16le
    required
Run Code Online (Sandbox Code Playgroud)

然后在您的 .gitattributes 文件中添加:

*.rc filter=utf16
resource.h filter=utf16
Run Code Online (Sandbox Code Playgroud)

如果您已有以 utf16 格式存储为二进制的现有文件,则需要从存储库中删除它们并重新添加它们。

git rm --cached <names-of-utf16-files>
git commit -am "removed utf16 files"
git add <names-of-utf16-files>
git commit -am "added utf16 files as utf8"
Run Code Online (Sandbox Code Playgroud)

现在一切都应该正常了。

  • 请小心此解决方案 - .gitconfig 100% 依赖于用户。我建议使用它来*过滤*您看到的内容,而不是*更改*存储的内容。例如,如果其他人在没有 .gitconfig 行的情况下检查了这一点(或者如果您在一两年内检查了这一点) - *您的代码将无法编译*。最好使用 [diff "utf16"] 而不是过滤器,因为 .rc *必须* 以 UTF-16 形式存储在存储库中。 (7认同)