Ошибка: не отображаемый символ для кодировки UTF8 после слияния GIT
После очередного git pull мой проект прекратил сборку с кучей сообщений:
error: unmappable character for encoding UTF-8
Сообщения указывают на символ авторского права, найденный в некоторых заголовках файлов. Есть еще много файлов с тем же символом, но, похоже, они хорошо компилируются. При просмотре в бинарном редакторе хороший выглядит так:
C2 A9
пока плохой
A9
При просмотре в vim оба отображаются как © (<©> 169, Hex 00a9, Octal 251), но IntelliJ Idea показывает плохие как ромб.
Поэтому я решил, что что-то испортил при слиянии (возникли конфликты слияния после pull) и пошел смотреть, какие файлы были изменены с помощью
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-алгоритма ={терпение | минимальный | гистограмма | майерс} - все еще не найдены изменения с помощью git-diff-tree
PS: git reset --hard HEAD~1, git pull origin developemnt
выданные из командной строки не помогли, поэтому не имеют отношения к идее.
2 ответа
Git diff-tree в этом случае оказался неправильным. Git diff - только для имени a35f25470bc8219e3f2a45316963dde660091bcb 0dfc19850b2e31d72c1d2923321430e8fc1b53cb
обнаружил множество изменений между ветвями и одно из них - обновление конфигурации maven-compiler-plugin, которое изменило версию java с 7 на 8. И похоже, что javac 8 рассматривает кодирование как ошибки, а 7 как предупреждение (хотя пишет абсолютно идентично) ошибка: не отображаемый символ для..."предупреждение в журнале.
git diff --name-only
действительно больше подходит для синтаксического анализа, как показано в Git 2.32 (Q2 2021), который поясняет, что имена путей, записанные в деревьях Git, чаще всего (но не обязательно) кодируются в UTF-8.
См. (20 апреля 2021 г.) Андрея Беньковского (
hexagonrecursion
) .
(ОбъединеноJunio C Hamano -
gitster
- в коммите 93e0b28 , 30 апр 2021 г.)
Коммит 9364bf4
doc
: уточните кодировку имени файла в git diff
AFAICT анализирует вывод
git diff --name-only master...feature
(man) - это предполагаемый способ программного получения списка файлов, измененных функциональной веткой.Невозможно проанализировать текст, если вы не знаете, в какой он кодировке.
теперь включает в свою справочную страницу :
Показывать только имена измененных файлов. Имена файлов часто кодируются в UTF-8.
diff-options
теперь включает в свою справочную страницу :
Как
--name-only
имена файлов часто имеют кодировку UTF-8..