Git无法区分或合并utf-16编码的.cs文件

本文关键字:编码 cs 文件 utf-16 合并 法区 Git | 更新日期: 2023-09-27 18:26:43

我和一个朋友同时处理同一个.cs文件,当出现合并冲突时,git指出存在冲突,但该文件没有加载通常的"HEAD">>>"内容,因为.cs文件是二进制文件。因此,我们在.gitattributes文件中添加了许多内容(*.cs-text等等),使git将其视为不起作用的文本文件。

那时我们意识到git可以区分其他.cs文件,而不是这个文件。原因是它采用unicode编码,因为它包含一些汉字。

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

令人沮丧的是,如果我推动,gitlab会显示出完全不同的东西。所以我不知道git如何在服务器上产生差异,但在bash中却不知道。

Git无法区分或合并utf-16编码的.cs文件

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

通过这种方式,git所做的一切,如diffs、合并或其他任何事情,都可以在utf8文本上正常工作,但您的工作副本将具有utf16,这将使visualstudio感到满意。

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

[filter "utf16"]
    clean = iconv -f utf-16le -t utf-8
    smudge = iconv -f utf-8 -t utf-16le
    required

然后在.gitattributes文件中添加:

*.rc filter=utf16
resource.h filter=utf16

如果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"

现在一切都应该运转起来了。