21

我有一个带有 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

我已将 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
4

6 回答 6

36

对我来说less——git 寻呼机——是罪魁祸首(感谢@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 

注意:该--RAW-CONTROL-CHARS选项会导致less通过 ANSI 颜色转义,但仍会处理其他控制字符(包括表情符号)。我less的全局配置--RAW-CONTROL-CHARS和我的 git 寻呼机--raw-control-chars如上所述。

于 2015-02-01T06:22:46.843 回答
19

对我来说,最好的解决方案是设置export LESSCHARSET=utf-8

在这种情况下,两者都git log -p显示git diffunicode 没有问题。

于 2016-12-25T20:24:18.200 回答
3

对于设置LANGC.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 @@
[-人-]{+丁+}

但是,在某些平台(例如Git for WindowsLANG )上似乎没有得到尊重:

$ 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>+}

这些平台上的解决方法是为 git diff提供 UTF-8 字符(例如$'[^\x80-\xBF][\x80-\xBF]*'for )的原始字节:'.'

$ 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 @@
[-人-]{+丁+}
于 2018-05-12T16:45:13.040 回答
2

我的解决方案是使用 git difftool。

我基于https://code.google.com/p/google-diff-match-patch/编写了这个工具https://github.com/chestozo/dmp

git diff --color-words=.与:)相比,有时它也会提供更好的差异

于 2015-04-08T17:31:20.843 回答
1

toolbear的答案对我不起作用,因为即使git --no-pager diff我也看到了不可读的字符(不是括号,但不可读),所以less不是核心问题。

我尝试了很多东西,但唯一有帮助的是在 .git\config 中包含从西里尔文到 utf-8 的显式转换(我使用的是 Windows 7)

[pager]
diff = iconv.exe -f cp1251 -t utf-8 | less  

请注意,我在这里专门进行了更改pager.diff,因为我仅在diff命令方面遇到了编码问题。出于某种奇怪的原因log,和reflog我一起工作得很好。但是,如果您也有其他命令的编码问题,您应该更改所有命令的寻呼机,如下所示:

[core]
...
pager = iconv.exe -f cp1251 -t utf-8 | less 
于 2021-03-12T11:22:50.800 回答
0

我看到很多报告 xterm 在某些情况下不能真正打印 Unicode 字符。也许至少是解决方案的起点。

于 2013-11-22T08:47:47.147 回答