为什么管道从 git 日志中删除分支名称?

Why does a pipe remove the branch names from git log?

当我运行

> 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 样式行为,但我今天不关心这两种方式)

这是我可以通过命令行参数重新启用的功能吗?

首先,我也注意到在 bash 的管道后缺少颜色,但是你描述的 decorations(分支和标签名称)消失是奇怪的。我们分别说一下。

自己处理分支名称(装饰)

--decorate

是那个标志,供 one-shot 使用。

对于永久效果,您可以在config

中设置
log.decorate true

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

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

结果看起来像这样

关于颜色

不,我不知道它在传递给 bash 时如何/为什么会中断,我会让更多高级用户回答该部分。 (正如我所说,就个人而言,我很高兴你问了这个问题,因为我也很想知道这个问题 - 编辑:谢谢 torek!:-) )

git log command is what Git calls porcelain. This means it is meant to be used by actual humans, as opposed to other Git commands like git rev-parse and git for-each-ref 大部分或全部用于 计算机程序 到 运行。

Porcelain 命令通常是可配置的,并且经常执行诸如颜色或分页输出之类的操作。 git log 也是如此。一些用于此的控件是 git config 个条目:

color.ui = auto
log.decorate = auto

auto 设置是默认设置 — 您可以将其更改为 alwaysnever — 告诉 Git:当命令将其输出写入终端时,执行此操作,但如果不执行此操作(如 git branch | grep ... 中写入管道时),则不要执行此操作。

log.decorate 选项控制 (master) 装饰。特定文本是否有颜色,如果有,用什么颜色,由相当复杂的选项迷宫控制,这些选项仅 starts with color.ui.

color.ui 设置为 always 将破坏 运行 管道中瓷器命令的原始脚本,并期望 color.ui 设置为其默认值 auto。 None 个 Git 自己的脚本像这样天真,但您可能正在使用自己的扩展,或者从没有考虑过该问题的人那里获得的扩展,因此在覆盖这些默认值时要小心.

(顺便说一句,注意设置中的=。例如,.git/configgit -c color.ui=true log中需要这些,但在git config log.decorate auto中是禁止的。这是历史文物和当时权宜之计的疯狂大杂烩。)