为什么在git log中使用管道会删除分支名称?

14

当我运行时

> git log --oneline

我得到了类似于这样的输出

abcdef0 (head, branch, origin/branch) comment
0987654 different comment
1234567 (different-branch, origin/branch) third comment

但是一旦我将输出发送到任何地方(例如> git log --oneline | cat),分支名称就会消失

abcdef0 comment
0987654 different comment
1234567 third comment
这意味着我无法使用grep,或添加行号,或执行任何类似的操作。
(它还缺少颜色和less样式的行为,但我今天不会在意这些)
这是否可以通过命令行参数重新启用?
2个回答

8

首先,我也注意到在使用bash管道操作后缺少了一些颜色,但是你描述的关于分支和标签名称消失的事情很奇怪。我们来分开来解决。

解决分支名称(装饰)本身问题

--decorate

对于一次性使用,该标志是用来表示的。

如果需要永久生效,您可以在您的配置文件中设置它。

log.decorate true

对于更具体的需求,注意您可以使用占位符%d以漂亮的格式进行使用,例如:

git log -10 --pretty=format:"%C(yellow)%h %C(reset)%aN %ar %C(red)%d %C(reset)%s"

要得到以下这样的结果

enter image description here

关于颜色

不,我不知道为什么在传递给bash时会出问题,我会让更高级的用户回答这个问题。(就像我说的,个人感觉很高兴你问了这个问题,因为我也非常想知道——编辑:谢谢torek!:-)


解释是,如果在不告诉git是否需要颜色的情况下运行它,git会尝试查看您是否正在运行虚拟终端(如控制台),并且如果输出未被管道或其他东西捕获...如果是这种情况,它将使用颜色。 - eftshift0
1
我认为还有--color / --no-color选项。 - eftshift0

7
git log命令是Git中的瓷器命令,它是为人类用户而设计的,与其他Git命令不同,比如git rev-parsegit for-each-ref这样的命令则主要或完全用于计算机程序运行。 瓷器命令通常是可配置的,并且经常会对输出进行着色或分页。git log也是如此。其中一些控制选项可以使用git config进行设置。
color.ui = auto
log.decorate = auto

auto 是默认设置,你可以将其更改为 always 或者 never。它告诉 Git:当命令将输出写入终端时执行,但当它不这样做时(例如在写入管道时,如 git branch | grep ...),就不要执行。

log.decorate 选项控制 (master) 的修饰。特定文本是否着色以及如果着色使用哪些颜色,由一系列非常复杂的选项控制,其中之一是 color.ui

color.ui 设置为 always 将破坏运行原始命令并期望 color.ui 被设置为其默认值 auto 的脚本。Git 自己的脚本都不是这样天真的,但是您可能正在使用自己的扩展或从未考虑过这个问题的人提供的扩展,请小心覆盖这些默认设置。

(顺便说一句,小心设置中的 =。在 .git/configgit -c color.ui=true log 中需要,但在 git config log.decorate auto 中禁止。这是历史遗留问题和当时编写的任意性混合而成的疯狂杂烩。)


我尝试了 git config --global color.ui always,但没有效果(我的测试是通过简单的 grep 发送我的常规日志别名(以漂亮的格式设置颜色))。我错过了什么? :-/ - Romain Valeri
1
@RomainValeri:不太确定,但请注意git log本身并不经常使用颜色:它只给提交哈希值和一些--decorate项目着色,并将大部分内容留给差异代码处理,其中color.diff将覆盖color.uigit log本身也可以使用--color=<when>,文档中说:“默认情况下,仅在为日志输出启用颜色(通过color.diff、color.ui或--color,并且如果我们要进入终端,则会遵守前者的自动设置)时才显示颜色。” - torek
1
与此同时,git config 的文档暗示说当某些程序查询时(例如git config --get-colorbool color.diff),color.diff 会覆盖 color.ui。我已将我的 color.diff 设置为 auto,但 git config --get-colorbool color.diff 对我来说没有输出任何内容。还有 color.pager,我不确定它是否会覆盖其他设置,尽管我没有自己设置它。 - torek

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