强制“ git status”在终端上输出颜色(在脚本内部)


71

编辑:

我想提出一个建议,即解析颜色通常是一个构思错误的想法。

我想要它的部分原因是我既可以解析它,又可以将其传递到我自己的脚本输出中。没关系,但是使用瓷器或类似瓷器自己重建彩色零件可能更明智!

原始问题如下。


我喜欢看到颜色,因为我的脚本足够强大(到目前为止)可以处理颜色代码。似乎我在这里背叛了话题,但老实说,我看不出必须解析脚本中的转义代码之类的东西有什么大不了的。如果颜色有助于交互使用,为什么它们不能在脚本使用中帮助我聚集数据并处理比手工更多的数据?颜色会更重要吗?

无论如何,我写了一个简洁的小shell脚本来修改git status输出,而我只是想使此脚本保持原样。设置我的全局git配置,以便在git状态下以彩色显示更改和未跟踪的文件列表。不幸的是,与之不同的git diffgit status,我没有找到强制使用颜色的选项。

明确地说,这是问题所在:

$ git status

产生完美的输出,但是(摘录自我的脚本)

git status | sed "s/^#/\x1b[34m#[0m/"

不会产生任何彩色git status输出,您甚至可以在此处看到我正在将前导哈希字符明确转换为蓝色,因为它有助于突出显示脚本输出的不同区域。

有谁知道如何使它熄灭颜色?我是否可以使用一个可用作“假终端” STDIN / STDOUT管道的标准程序?实际上,我也在开发pty伪终端工具,因此我可以为此目的当然使用它,但这是一个比较繁琐的解决方案(由于我尚未完成构建,因此尚未准备就绪)。



5
解析颜色代码以提取有意义的脚本数据的一个问题是,不同的用户可能已在其配置文件中配置了不同的颜色。为了避免可能引起的问题,git--porcelain为各种命令提供了选项,该命令应提供一种易于解析且在环境之间不易更改的格式。
joeytwiddle 2014年

1
作为设计说明,在@joeytwiddle的评论中添加一个注释,将状态信息编码为颜色是一个不好的主意,因为某些人有各种色盲(红绿色是最常见的,但蓝黄色也是最常见的,等等) ;有关详细信息,请参见nei.nih.gov/health/color_blindness/facts_about)。它影响了大约10%的人类!始终确保除了单纯的颜色外还有其他方法可以提取必要的信息。
torek's

Answers:


114

为了避免更改git config,您可以通过传递config变量来为当前命令启用颜色 -c

对于status命令,变量为color.status

    git -c color.status=always status | less -REX

diffshowloggrep命令中,变量是color.ui

    git -c color.ui=always diff | less -REX

需要注意的是-c一定要来之前statusdiff论点,而不是之后。

或者,diffshowloggrep命令,你可以使用--color=always 之后的命令:

    git diff --color=always | less -REX

注意:正如史蒂文所说,如果您试图提取有意义的数据,则可以使用--porcelain解析器友好的输出,而不是解析颜色来提取含义。

    git status --porcelain | awk ...

然后,如果需要,可以稍后重新引入颜色。

要获取用户配置的颜色,可以使用git config --get-colour

    reset_color="$(tput sgr0)"
    remote_branch_color="$(git config --get-color color.branch.remote white)"

    echo "Pushing to ${remote_branch_color}${branch_name}${reset_color}"

这里还有更多示例。


1
您说它适用于log,但是我发现情况并非如此。:(
阿德里安

3
嗯,看来这与log不同。命令是git log --color=always。与命令行界面的不一致太糟糕了。
阿德里安

2
看起来git试图通过diffshowlog来统一此--color=...命令,就像我说的那样,在命令之后使用了开关,但是没有使用status
阿德里安

1
我发布了问题;在我执行解析的代码部分中git status,它们会解析的输出git status --porcelain。不过,知道我们可以使用来为git覆盖当前调用的配置非常酷-c
史蒂文·卢

在此答案中,更有用的git colourise / colorize信息:unix.stackexchange.com/a/44283/357604
NeilG

20

编辑:

我强烈建议解析颜色是一个通常不正确的想法。

我想要它的部分原因是我既可以解析它,又可以将其传递到我自己的脚本输出中。没关系,但是使用瓷器或类似瓷器自己重建彩色零件可能更明智!

原始答案如下。


提出问题后,我会一直很快找到答案。与思考问题足够长的时间有关,可以写出为解决问题制定更好的方法。无论如何,解决方案只是

git config color.status always

我想象一个通用解决方案涉及expect或与之pty相关的事情,可以迫使任何需要它的程序都认为它们在终端上。


7
@joeytwiddle有一个更好的答案...始终强制使用颜色意味着您可能会在某些不需要颜色的地方获得颜色。使用-c将范围限制为所讨论的脚本。
danwyand 2014年

4
git config --global color.ui auto
Ashish Sajwan

1
我切换了接受状态,它确实可以直接回答我的问题。@AshishSajwan将颜色设置为auto表示使用脚本运行时将不会产生颜色。
史蒂文·卢

是的,输出通常要么是人类可读的,要么是机器可读的,并且它们具有完全不同的属性。
劳尔·萨利纳斯-蒙塔古多

1
如果您确实要解析瓷器数据,然后将自己的颜色代码添加到输出中,那么您可以检查用户是否为诸如此类的某些事情配置了首选颜色:current_branch_termcode="$(git config --get-color color.branch.current green)"如果green没有,您要使用的后备方法在哪里?找到自定义配置(最好在此放置git的默认颜色)。
joeytwiddle19年

2

使用执行shell命令的git别名时,我遇到了同样的问题。显然git shell不会从当前环境继承,因此它对我的颜色设置一无所知。

除了添加全局git color ui设置之外,我还通过使别名看起来像下面这样来解决了此问题,它是要求告诉用户使用颜色的第二个命令,因为git在默认情况下与人们提到的1.8.x版本一样。

[alias]
  ignored = !git ls-files -v|grep --color '^h'

现在,当以别名方式运行时,就像我刚运行命令一样,这将产生等效的彩色输出。

对于sed,此其他答案似乎更可靠地工作,请使用tput。 https://unix.stackexchange.com/a/45954


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
ZygD 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.