在又一次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无关。
答案 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 9364bf4 的 Andrey 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 编码..