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

McK*_*Kay 4 git branch git-log

当我跑步时

> git log --oneline
Run Code Online (Sandbox Code Playgroud)

我得到的输出看起来像这样

abcdef0 (head, branch, origin/branch) comment
0987654 different comment
1234567 (different-branch, origin/branch) third comment
Run Code Online (Sandbox Code Playgroud)

但是,只要将输出通过管道传递到任何内容(例如> git log --oneline | cat),分支名称就消失了

abcdef0 comment
0987654 different comment
1234567 third comment
Run Code Online (Sandbox Code Playgroud)

这意味着我不能grep或添加行号或类似的东西。

(它也缺少颜色和less样式行为,但我今天不在乎这两种方式)

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

Rom*_*eri 5

首先,我也注意到在用管道敲击后缺少颜色,但是你描述的装饰(分支和标签名称)消失很奇怪。让我们分别处理它们。

自己寻址分支名称(装饰)

--decorate
Run Code Online (Sandbox Code Playgroud)

是用于一次性使用的标志。

对于永久效果,您可以在配置中进行设置

log.decorate true
Run Code Online (Sandbox Code Playgroud)

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

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

看起来像这样的结果

在此处输入图片说明

关于颜色

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


tor*_*rek 5

这个git log命令就是Git所说的瓷器。这意味着,它的目的是通过实际的人也可使用,而不是像其他Git命令git rev-parsegit for-each-ref被大部分或完全意味着计算机程序运行。

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

color.ui = auto
log.decorate = auto
Run Code Online (Sandbox Code Playgroud)

自动设置是默认设置,您可以将其更改为always或- never告诉Git:当命令将其输出写入终端时,请执行此操作,但是当命令没有将其写入时(例如,将其写入管道时git branch | grep ...),请不要不做。

log.decorate选项控制(master)装饰。无论具体的文本颜色的,如果是这样,与颜色,是通过选择一个相当复杂的迷宫,仅仅控制开始color.ui

设置color.uialways将会破坏在管道中运行瓷器命令的纯真脚本,并且期望color.ui将其设置为默认脚本auto。Git自己的脚本都不是天真的,但是您可能正在使用自己的扩展名,或者是从不考虑该问题的人员那里获得的扩展名,因此在覆盖这些默认值时请务必小心。

(顺便说一句,小心的=在设置。这些都需要内部.git/configgit -c color.ui=true log,例如,但禁止git config log.decorate auto。这是历史文物的一个疯狂的混杂和编码无论是当时的权宜之计。)