【问题标题】:Force "git status" to output color on the terminal (inside a script)强制“git status”在终端上输出颜色(在脚本内)
【发布时间】:2013-04-11 00:31:59
【问题描述】:

编辑:

我想提出一个建议,即解析颜色通常是一个考虑不周的想法。

我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这……好吧,但使用瓷器或其他类似的东西并自己重新制作彩色部件可能会更明智!

原始问题如下。


我喜欢看颜色,因为我的脚本足够强大(到目前为止)可以处理颜色代码。看起来我在这里违背了规律,但老实说,我不明白必须解析脚本中的转义码之类的东西有什么大不了的。如果颜色有助于交互式使用,为什么它们不能帮助我可能聚合数据并处理比手动更多的数据的脚本使用?颜色不是更重要吗?

无论如何,我有一个整洁的小 shell 脚本,我写了 munges git status 输出,我只是想让这个脚本保持颜色完整。我的全局 git 配置已设置,以便更改和未跟踪文件的列表在 git 状态中以颜色显示。不幸的是,与git diff 不同的是,我找不到为git status 强制颜色的选项。

很清楚,这就是问题所在:

$ git status

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

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

不会产生彩色的git status 输出,您甚至可以在这里看到我明确地将前导散列字符转换为蓝色,因为它有助于突出显示脚本中不同的输出区域。

有谁知道如何让它熄灭颜色?是否有可以用作“假终端”STDIN/STDOUT 管道的标准程序?事实上,我也在开发一个 pty 伪终端工具,所以我当然可以为此目的使用它,但它是一个相当笨拙的解决方案(并且还没有准备好使用,因为我还没有完成构建它)。

【问题讨论】:

  • 解析颜色代码以提取对脚本有意义的数据的一个问题是,不同的用户可能在他们的配置文件中配置了不同的颜色。为避免可能导致的问题,git 为各种命令提供了--porcelain 选项,该选项应提供一种更易于解析且不易在环境之间更改的格式。
  • 添加到@joeytwiddle 的评论中,作为设计说明,将状态信息编码为 only 颜色是一个坏主意,因为有些人有各种色盲(红色-绿色是最常见的,但也有蓝黄色等等;详情请参阅nei.nih.gov/health/color_blindness/facts_about)。它影响了大约 10% 的人类!始终确保除了颜色之外还有其他方法可以提取必要的信息。

标签: git shell unix io terminal


【解决方案1】:

为避免更改 git 配置,您可以通过使用 -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

注意:正如 Steven 所说,如果您要尝试提取有意义的数据,那么您可以使用 --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}"

更多示例here

【讨论】:

  • 你说它适用于 log,但我认为不是这样。 :(
  • 嗯,看起来这与 log 不同。命令是git log --color=always。与命令行界面的不一致太糟糕了。
  • 看起来 git 试图将其与 diffshowlog 统一起来,之后使用 --color=... 开关正如我所说的命令,但没有用 status 更新它。
  • 我发布了这个问题;在我的解析git status的部分代码中,它们解析git status --porcelain的输出。尽管如此,知道我们可以使用 -c 覆盖当前调用的 git 配置是非常酷的。
  • git -c color.ui=always status 在 git 版本 2.20.1 中工作,无需使用另一个变量 color.status
【解决方案2】:

编辑:

我强烈建议解析颜色通常是一个错误的想法。

我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这……好吧,但使用瓷器或类似的东西并自己重新制作彩色部件可能会更明智!

原始答案如下。


在提出问题后,我总是很快就能找到答案。与思考一个问题足够长的时间以将其写出来以制定更好的方法来解决它有关。无论如何,解决这个问题只是

git config color.status always

我认为通用解决方案涉及 expectpty 相关的东西,以强制任何需要它的程序认为它们在终端上。

【讨论】:

  • @joeytwiddle 有一个更好的答案...总是强制颜色意味着您可能会在某些您不想要的地方获得颜色。使用 -c 将范围限制为相关脚本。
  • git config --global color.ui auto
  • 我切换了接受,它确实更直接地回答了我的问题。 @AshishSajwan 将颜色设置为自动意味着它在使用脚本运行时不会产生颜色。
  • 是的,输出通常要么是人类可读的,要么是机器可读的,它们具有完全不同的属性。
  • 如果您确实采用了解析瓷器数据的路线,然后将自己的颜色代码添加到输出中,您可以检查用户是否为某些事情配置了首选颜色,例如:current_branch_termcode="$(git config --get-color color.branch.current green)" where如果没有找到自定义配置,green 是您想要使用的后备(理想情况下将 git 的默认颜色放在那里)。
【解决方案3】:

我在使用执行 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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
猜你喜欢
  • 2013-08-27
  • 2019-10-19
  • 2013-04-05
  • 2010-12-14
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多