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

时间:2019-06-20 23:15:08

标签: git branch 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样式行为,但我今天不在乎这两种方式)

可以通过命令行参数重新启用吗?

2 个答案:

答案 0 :(得分:4)

git log command是Git所说的瓷器。这意味着它应该由实际的人使用,而不是像git rev-parsegit for-each-ref这样的其他Git命令,这些命令主要或完全用于计算机程序的运行。 / p>

瓷器命令通常是可配置的,并且经常执行诸如着色或对输出进行分页等操作。 git log也是如此。其中的几个控件是git config条目:

color.ui = auto
log.decorate = auto

auto 设置是默认设置,您可以将其更改为alwaysnever,告诉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中则是禁止的。疯狂的历史文物杂乱混搭,并编码当时的权宜之计。)

答案 1 :(得分:2)

首先,我也注意到在用力扑打之后缺少颜色,但是您对装饰(分支和标签名称)消失的描述很奇怪。让我们分别处理它们。

自己解决分支名称(装饰)

--decorate

是该标志,仅供一次使用。

要获得永久效果,可以在config

中进行设置
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!:-)