强制"git status"在终端上输出颜色(在脚本中)

Ste*_* Lu 57 unix git io shell terminal

编辑:

我想建议解析颜色是一个普遍错误的想法.

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

原始答案如下.


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

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

非常清楚,这就是问题所在:

$ git status
Run Code Online (Sandbox Code Playgroud)

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

git status | sed "s/^#/\x1b[34m#[0m/"
Run Code Online (Sandbox Code Playgroud)

不产生彩色git status输出,你甚至可以看到我明确地将前导哈希字符转换为蓝色,因为它有助于突出显示我脚本输出的不同区域.

有谁知道如何让它褪色?是否有可以使用的标准程序可以用作"假终端"STDIN/STDOUT管道?我实际上也在研究一个pty伪终端工具,所以我当然可以为此目的使用它,但它是一个相当苛刻的解决方案(并没有准备好使用,因为我还没有完成构建它).

joe*_*dle 89

为避免更改git配置,您可以通过传递config变量来为当前命令执行此操作-c:

    git -c color.status=always status | less -REX
Run Code Online (Sandbox Code Playgroud)

该变量仅适用于该status命令.为diff,show并且log该变量是color.ui:

    git -c color.ui=always diff | less -REX
Run Code Online (Sandbox Code Playgroud)

请注意,-c必须成为之前statusdiff论点,而不是之后.

  • 嗯,看起来这对于 **log** 来说是不同的。命令是`git log --color=always`。与命令行界面的不一致太糟糕了。 (3认同)
  • `git -c color.ui=always status` 适用于 git 版本 2.20.1,无需使用另一个变量 `color.status`。 (3认同)
  • 你说它适用于 **log**,但我发现情况并非如此。:( (2认同)
  • 好像git试图通过我说过的命令后使用`--color = ...`开关来使它与diff,show和log统一,但是没有更新状态为**。 (2认同)
  • 我发布了这个问题;在我的代码中解析“git status”的部分中,它们解析“git status --porcelain”的输出。尽管如此,知道我们可以使用“-c”覆盖当前调用的 git 配置是非常酷的。 (2认同)

Ste*_* Lu 20

编辑:

我想强烈建议解析颜色是一个普遍错误的想法.

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

原始答案如下.


在提问之后,我一直很快找到答案.与思考问题的时间有关,可以写出来,制定更好的方法来解决问题.无论如何,解决方案就是这样

git config color.status always
Run Code Online (Sandbox Code Playgroud)

我认为通用解决方案涉及expectpty强制任何需要它的程序认为它们在终端上.

  • @joeytwiddle有一个更好的答案...总是强制颜色意味着你可能会在一些你不想要它的地方获得颜色.使用-c将范围限制为相关脚本. (7认同)
  • `git config --global color.ui auto` (3认同)