3

在又一次 git pull 之后,我的项目停止了构建,并带有一堆消息:

error: unmappable character for encoding UTF-8

这些消息指向在某些文件标题中找到的版权符号。还有更多具有相同符号的文件,但它们似乎编译得很好。在二进制编辑器中查看时,好的显示为:

C2 A9

虽然不好

A9

在 vim 中查看时,两者都显示为 © (<©> 169, Hex 00a9, Octal 251),但 IntelliJ Idea 将坏的显示为菱形。

所以我决定我在合并时弄乱了一些东西(拉后有合并冲突),然后去看看哪些文件发生了变化

git diff-tree --no-commit-id --name-only -r --full-index --binary 91cbe7b753d39905372c1ea41e04e7a3dbd2566e

但它不会产生任何结果。也没有发现上一次提交的更改。日志如下所示:

commit 91cbe7b753d39905372c1ea41e04e7a3dbd2566e
Merge: d7b4ae9 0dfc198
Author: Me Me <my.my@gmail.com>
Date:   Wed Dec 23 17:50:46 2015 +0100

    Merge branch 'development' of ssh://fsstash.cool.com:7999/our/server into my-branch

commit 0dfc19850b2e31d72c1d2923321430e8fc1b53cb
Merge: 724b8a7 d3478f9
Author: Good Guy <Good.Guy@gmail.com>
Date:   Wed Dec 23 14:34:33 2015 +0200

    Merge branch 'development' of ssh://fsstash.cool.com:7999/our/server into development

当我做 git checkout 0dfc19850b2e31d72c1d2923321430e8fc1b53cb 一切编译正常。

所以问题是:我该如何解决它?

通过修复,我的意思是了解发生了什么并重新应用拉取更改(也许),这样我就不必将与此修复相关的任何内容提交到上游存储库中。

似乎不好的是 UTF-16 (0x00A9) 而好的是 UTF-8 - (0xC2 0xA9)。什么可能改变了它?

构建系统是 maven,但它与裸 javac 在复制和缩小文件上报告的相同错误无关。操作系统是 ubuntu 15.10,语言环境是这样说的:

locale
LANG=ru_RU.UTF-8
LANGUAGE=ru:en
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC=ru_UA.UTF-8
LC_TIME=ru_UA.UTF-8
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY=ru_UA.UTF-8
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER=ru_UA.UTF-8
LC_NAME=ru_UA.UTF-8
LC_ADDRESS=ru_UA.UTF-8
LC_TELEPHONE=ru_UA.UTF-8
LC_MEASUREMENT=ru_UA.UTF-8
LC_IDENTIFICATION=ru_UA.UTF-8
LC_ALL=

java-版本:1.8.0_66。

非常感谢任何帮助!

PS:尝试了所有 --diff-algorithm={patience|minimal|histogram|myers} - git-diff-tree 仍然没有发现任何变化

PS:git reset --hard HEAD~1, git pull origin developemnt从命令行发出没有帮助,所以与Idea无关。

4

2 回答 2

1

git diff --name-only确实更适合解析,如 Git 2.32 (Q2 2021) 所示,它阐明了记录在 Git 树中的路径名通常(但不一定)以 UTF-8 编码。

请参阅Andrey Bienkowski ( ) 的commit 9364bf4(2021 年 4 月 20 日(由Junio C Hamano 合并 -- --提交 93e0b28中,2021 年 4 月 30 日)hexagonrecursion
gitster

doc: 阐明 git diff 中的文件名编码

AFAICT 解析( man )的输出是以编程方式获取功能分支修改的文件列表的预期方式。git diff --name-only master...feature

除非您知道文本的编码方式,否则无法解析文本。

diff-options现在在其手册页中包含:

仅显示更改文件的名称。文件名通常以 UTF-8 编码。

diff-options现在在其手册页中包含:

就像--name-only文件名通常以 UTF-8 编码一样。

于 2021-05-02T00:35:44.383 回答
1

在这种情况下, git diff-tree 似乎是错误的差异。git diff --name-only a35f25470bc8219e3f2a45316963dde660091bcb 0dfc19850b2e31d72c1d2923321430e8fc1b53cb

揭示了分支之间的许多变化,其中一个更新了 maven-compiler-plugin 配置,将 java 版本从 7 更改为 8。看起来 javac 8 将编码视为错误,而 7 视为警告(尽管写的完全相同“错误:无法映射的字符 ...” 对日志的警告。

于 2015-12-25T16:10:41.307 回答