git diff показывает символы Юникода в угловых скобках

У меня есть файл с символами Unicode (русский текст). Когда я исправляю опечатку, я используюgit diff --color-words=. чтобы увидеть изменения, которые ямы сделали.

В случае символов юникода (кириллицы) я получаю некоторую путаницу с угловыми скобками, например:

$ cat p1
привет

$ cat p2
Привет

$ git diff --color-words=. --no-index p1 p2
diff --git 1/p1 2/p2
index d0f56e1..d84c480 100644
--- 1/p1
+++ 2/p2
@@ -1 +1 @@
ривет

Это выглядит какgit diff --color-words=. проверяет разницу между байтами, а не между символами, как я ожидаю.

Есть ли способ сказатьgit правильно работать с символами Unicode?

UPD о моей среде: я получаю то же самое на Mac OS и на хосте Linux.

Мои оболочки оболочки:

BASH=/bin/bash
HOSTTYPE=x86_64
LANG=ru_RU.UTF-8
OSTYPE=darwin10.0
PS1='\h:\W \u\$ '
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
TERM=xterm-256color
TERM_PROGRAM=iTerm.app
_=-l

Я сбросил git config к настройкам по умолчанию примерно так:

$ git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true

мерзавец версия

$ git --version
git version 1.7.3.5
 chestozo26 июн. 2013 г., 22:14
Я пробовал это также:$ GIT_PAGER='' git diff --no-index --color-words=. p1 p2 ���ривет  $ GIT_PAGER='' git diff --no-index --color-words=. --no-color p1 p2 п�ривет
 chestozo26 июн. 2013 г., 22:09
Я обновил вопрос, указав в нем подробности env. Также я попытался настроить Git Pager так:$ git config --global core.pager "less -R" и это не помогает.
 Jokester13 мая 2016 г., 11:58
--word-diff-regex=. работает на уровне байтов и разбивает многобайтовый символ. К сожалению, эта опция также не поддерживает диапазон кодовых точек (пробная нотация posix и pcre, но ни одна из них не работала).
 kostix26 июн. 2013 г., 15:34
Тот'неgit diff показывая вамугловые скобки" скорееless - пейджер по умолчаниюgit diff звонки. Попробуйте экспортироватьLESSOPTS=-R или жеLESSOPTS=-RX и посмотрим, поможет ли это. Там'С вашим вопросом также связана проблема: вы сообщаете нам абсолютно нулевую информацию о вашей среде.

Ответы на вопрос(5)

Решение Вопроса

Я написал этот инструментhttps://github.com/chestozo/dmp основанный наhttps://code.google.com/p/google-diff-match-patch/.

Иногда это также дает лучшую разницу по сравнению сgit diff --color-words=. :)

export LESSCHARSET=utf-8

В этом случае обаgit log -p а такжеgit diff показывает юникод без проблем.

 chestozo25 дек. 2016 г., 23:50
тоже самое$ echo $LANG >>> en_US.UTF-8, Я вижу этот ответ также здесь -stackoverflow.com/a/19436421/449345 - но как-то это не такт помощь: /
 Maga Abdurakhmanov25 дек. 2016 г., 23:11
Вот то, что я получаю сgit diff а такжеgit diff --color-words=. dropbox.com/s/2wt9iysevw2xeyn/...
 Maga Abdurakhmanov25 дек. 2016 г., 23:10
У вас установлен LANG? МойLANG=en_US.UTF-8
 chestozo25 дек. 2016 г., 21:46
что ты видишь?git diff --color-words=.
 ardal13 авг. 2017 г., 12:05
Это решило это для меня. Создана новая переменная средыLESSCHARSET установлен вutf-8 а также /git logdiff теперь отображает норвежские буквы ÆØÅ правильно поставлен и т.д. ОС: Windows 10
 chestozo25 дек. 2016 г., 21:45
Безразлично»я не работаю я имеюpager = less -rFX в.gitconfig и это то, что я получаюd17oy1vhnax1f7.cloudfront.net/items/2p3703271r0m060s1J34/...
 Maga Abdurakhmanov25 дек. 2016 г., 23:16
Вот когда вы изменили кириллицуdropbox.com/s/1x67c5jdngrhgp2/...

в которых xterm не может печатать символы Юникода в некоторых случаях. Может быть, по крайней мере, отправная точка для решения.

 chestozo23 нояб. 2013 г., 16:56
В этом случае проблема в 2 байтах, используемых для представления символа юникода в оболочке. В то время какgit diff знает только, чтобы иметь дело с 1 байтами символов. Я не уверен, что это проблема Xterm.
 frlan23 нояб. 2013 г., 19:25
Ну ... неПохоже ... по крайней мере, это сработало для меня. + μÜäčřúůжжвыаьь

Для меняless - мерзавец пейджер - был виноват (спасибо @kostix). Поэкспериментируйте, отключив пейджер:

git --no-pager diff p1 p2

Мой случай заключался в фиксации сообщений, содержащих смайлики; Это'в принципе та же проблема, хотя.

$ git log --oneline
93a1866 <u+1f43c>

$ git --no-pager log --oneline
93a1866 

$ export LESS='--raw-control-chars'
$ git log --oneline
93a1866 

$ git config --global core.pager 'less --raw-control-chars'
$ git log --oneline
93a1866 
</u+1f43c>

NB:--RAW-CONTROL-CHARS выбор причинless проходить через цветовые экранирования ANSI, но все равно будет изменять другие контрольные символы (включая эмодзи). мойless глобально настроен с--RAW-CONTROL-CHARS и мой мерзавец с--raw-control-chars как указано выше.

 Kamafeather24 февр. 2019 г., 00:27
Безразлично»исправить для меня; У кого-нибудь есть другие предложения?🔸 У меня уже былоpager = less -FrSX под[core] в моем~ / .Gitconfig но это неТ помочь.🔸 Моя средаLANG являетсяen_US.UTF-8; окрМЕНЬШЕ является-M -I -R (пытаюсь изменить-R в-r Безразлично»изменить поведение).
 chestozo19 апр. 2016 г., 16:48
Важная часть была--color-words=. потому что я хочу видеть разницу по символу. И вот что я запускаю:git --no-pager show --color-words=.���ривет, То же дляgit --no-pager diff --color-words=. --no-index p1 p2
 simey.me16 янв. 2017 г., 11:19
git config --global core.pager 'less --raw-control-chars' было именно то, что мне нужно, чтобы исправить проблемы с отображением журнала git!

Для нескольких платформ настройкиLANG вC.UTF-8 (или жеen_US.UTF-8и т. д.) будет работать:

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ LANG=C.UTF-8 git diff --no-index --word-diff=plain --word-diff-regex=. -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
[-人-]{+丁+}

Тем не мение,LANG Безразлично»на некоторых платформах (например,Git для Windows):

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ LANG=C.UTF-8 git diff --no-index --word-diff=plain --word-diff-regex=. -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
<e4>[-<ba><ba>-]{+<b8><81>+}
</b8></ba></ba></e4>

Обходной путь на этих платформах заключается в предоставлении необработанных байтов для символов UTF-8 (например,$'[^\x80-\xBF][\x80-\xBF]*' за'.') чтобы сделать diff:

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ git diff --no-index --word-diff=plain --word-diff-regex=[^\x80-\xBF][\x80-\xBF]*' -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
[-人-]{+丁+}
 chestozo13 мая 2018 г., 10:16
LANG var в моем случае этоen_US.UTF-8 и это нене очень помогает.git diff --color-words=. --word-diff-regex=$'[^\x80-\xBF][\x80-\xBF]*' хороший! спасибо) проверю!
 Yarek T13 авг. 2018 г., 18:12
Будьте осторожны с рендерингом символов UTF8 в git diff. Очень возможно скрыть некоторый вредоносный код, скрывая его с сомнительными символами UTF8 (символы нулевой ширины i 'смотрю на тебя)
 Danny Lin13 мая 2018 г., 10:22
Если вы используете --word-diff-regex, это 'Было бы лучше использовать --word-diff = color вместо --color-words (который является комбинацией обоих). Кроме того, вы можете установитьdiff.wordRegex так что в будущем вы можете указать только --word-diff = color, и git будет использовать настроенное регулярное выражение для слова diff.

Ваш ответ на вопрос