错误:GIT合并后编码UTF8的不可映射字符

时间:2015-12-24 21:48:27

标签: git javac utf git-diff git-diff-tree

在又一次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说:

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 -version:1.8.0_66。

非常感谢任何帮助!

PS:尝试了所有--diff-algorithm = {耐心|最小|直方图|迈尔斯} - 仍然没有找到git-diff-tree发生的变化

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

请参阅 commit 9364bf4Andrey Bienkowski (hexagonrecursion)(2021 年 4 月 20 日)。
(2021 年 4 月 30 日在 Junio C Hamano -- gitster --commit 93e0b28 合并)

<块引用>

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

<块引用>

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

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

diff-options 现在包含在其 man page 中:

<块引用>

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

diff-options 现在包含在其 man page 中:

<块引用>

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