8

我和一个朋友同时处理同一个 .cs 文件,当存在合并冲突时,git 指出存在冲突,但文件没有加载通常的“HEAD”>>>“因为 .cs 文件是二进制文件。因此,我们在 .gitattributes 文件中添加了许多东西(*.cs 文本等),以使 git 将其视为无效的文本文件。

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

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

令人沮丧的是,如果我推动,gitlab 会显示出什么不同。所以我不明白 git 如何在服务器上区分,但不能用 bash。

4

1 回答 1

4

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

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

要配置它,请确保您使用的是具有可用 iconv 的 git 版本(最新版本的 msysgit 可以)并将以下内容添加到您的 ~/.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"

现在一切都应该正常了。

于 2014-03-10T06:05:59.843 回答