在Git中,ANSI颜色未正确显示。

69

最近我切换到了SLES 11。我在使用git命令时发现了一个问题。所有的ANSI颜色都不能正常显示,而是显示类似于这样的ANSI代码:

*ESC[33m*commit 0a02124a0fd85c1f0094bcdf15bac1645e3c8630ESC[m

注意:在 'ls' 命令中的ANSI颜色能够正常工作。


这可能是 https://dev59.com/61rUa4cB1Zd3GeqPgApj 的重复 - 假设您考虑了sehe的答案。(我真的不知道为什么人们试图设置LESS来帮助Git - 它知道它需要什么。) - Cascabel
我已经设置了LESS使用其他设置。 - ben3000
8个回答

75

尝试设置LESS环境变量,包含-R选项:

LESS=-R git grep ...
如果这有效,将export LESS=-R添加到您的~/.bashrc~/.profile或类似的Shell启动文件中。
   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI "color" escape sequences are
          output in "raw" form.  Unlike -r, the screen
          appearance is maintained correctly in most cases.
          ANSI "color" escape sequences are sequences of the
          form:

               ESC [ ... m

          where the "..." is zero or more color specification
          characters

4
你还应该能够更改core.pager配置参数。我认为只是用“-R”对于Git来说并不理想,它真正偏爱的是FRSX,并且如果你尚未在环境中设置LESS,它将设置为FRSX。 - Cascabel
1
@Jefromi:我建议将其添加为答案,这很容易值得十分。 :) - sarnold

31
问题在于,正如其他人指出的那样,您的终端很好,但是当Git调用分页器时,它没有正确解释ANSI颜色代码。
我建议从在环境中取消设置 < code> LESS 开始;听起来您可能之前已经将其设置为某些模糊Git所需内容的东西。如果这可以解决问题,那就没问题了。如果您确实必须自定义 LESS ,请注意,Git默认情况下以 FRSX 为开头,因此请谨慎更改它们(除非您不需要)。
如果您无论出于任何原因都希望将 LESS 与Git不同,则通过 core.pager 配置变量处理Git和分页器是理想的方法。引用手册:
“git将用于分页输出的命令。可以使用GIT_PAGER环境变量覆盖。请注意,如果运行分页器时未设置LESS环境变量,则git将LESS环境变量设置为FRSX。可以通过将LESS变量设置为其他值来更改这些设置。或者,可以通过设置core.pager选项对这些设置进行项目或全局基础上的覆盖。设置core.pager对以上LESS环境变量行为没有影响,因此,如果要以这种方式覆盖git的默认设置,则需要明确设置。例如,要以向后兼容的方式禁用S选项,请将core.pager设置为 less -+$LESS -FRX 。这将由git传递给shell,shell将将最终命令转换为 LESS = FRSX less-+FRSX-FRX 。”
这结合了您所需选项的一些知识,应该可以让您达到目标。(花哨的向后兼容方法的工作原理是先禁用当前在 LESS 中的所有选项,然后再添加您所需的选项)。

20
在git中,您可以更改分页器以使用-R选项:
git config --global core.pager "less -R"

我必须先取消设置,然后将 less -R 用引号括起来。虽然有些麻烦,但最终还是解决了。 - mtfurlan

7

对我来说,这并没有起作用:

git config --global core.pager less -R

所以我在我的~/.gitconfig文件中添加了以下内容:

 [core]
     pager = less -R

为了测试它,我执行了以下命令:

git log --graph --pretty=format:"%C(yellow)%h%Creset%C(blue)%d%Creset %C(white bold)%s%Creset %C(white dim)(by %an %ar)%Creset" --all


你可以尝试使用"--no-pager" 开关。例如, "git --no-graph diff"。 - robster_guy

5

好的,我明白了。这个问题与变量LESS有关。

以下行解决了这个问题:

export LESS="-erX"

2
你应该使用“-eRX”而不是“-erX”(根据上面sarnold的回答)。如果你使用“-r”,那么更少的控制字符将直接通过(这可能不是你想要的),并且less无法正确确定输出行数,因此一些内容会滚动到屏幕外(这绝对不是你想要的)。“-e”和“-X”的使用与解释颜色转义序列无关。“-e”使less在第二次达到文件结尾时自动退出,“-X”“禁用向终端发送termcap初始化和去初始化字符串。” - craigster0

2
我有同样的问题。但是为什么我需要在一台机器上配置git而另一台机器不需要?我想修复问题的根源,因为

git config --global core.pager "less -R"

对我来说看起来像一个解决方法。

0

0
我在 Laravel Artisan 和 Symfony 控制台中的 Git for Windows v2.7.1 中遇到了 ANSI 颜色转义序列的类似问题。这里提到的 LESS 解决方案没有解决问题。
由于 Git for Windows 使用 bash --login -i 打开终端,所以在终端启动后输入以下命令对我有效:
bash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接