Git diff показывает символы Unicode в угловых скобках

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

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

$ 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 @@
<D0><BF><9F>ривет

Похоже, что 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

У меня есть reset git config для настроек по умолчанию:

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

git версия

$ git --version
git version 1.7.3.5

Ответ 2

Для меня less - пейджер git - виноват (спасибо @kostix). Эксперимент, полностью отключив пейджер:

git --no-pager diff p1 p2

В моем случае были сообщения о фиксации, содержащие emojis; это принципиально та же проблема.

$ 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 🐼

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

Ответ 3

Для меня лучшим решением для этого является установка export LESSCHARSET=utf-8.

В этом случае как git log -p, так и git diff отображает unicode без проблем.

Ответ 4

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