【问题标题】:Why does a pipe remove the branch names from git log?为什么管道会从 git log 中删除分支名称?
【发布时间】:2023-04-01 18:05:02
【问题描述】:

当我跑步时

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

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

【问题讨论】:

    标签: git format git-branch git-log


    【解决方案1】:

    git log command 是 Git 所称的 瓷器。这意味着它是供真正的人类使用的,而不是像 git rev-parsegit for-each-ref 这样的其他 Git 命令,它们主要或完全是为了计算机程序运行。

    Porcelain 命令通常是可配置的,并且经常执行颜色或对其输出进行分页等操作。 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 中禁止使用。这是历史文物和编码的疯狂混搭当时是权宜之计。)

    【讨论】:

    • 我尝试了git config --global color.ui always,但没有效果(我的测试是通过一个简单的 grep 发送我常用的日志别名(颜色设置为漂亮格式))。我错过了什么? :-/
    • @RomainValeri:不确定,但请注意 git log 本身并没有使用太多颜色:它为提交哈希 ID 和一些 --decorate 项目着色,其余大部分留给color.diff 将覆盖 color.ui 的差异代码。 git log 本身也采用 --color=<when> 并且文档说:“默认情况下,仅在启用日志输出时显示颜色(通过 color.diff、color.ui 或 --color,并尊重自动设置前者,如果我们要去一个终端)。..."
    • 同时git config 文档暗示color.diff 在某些程序查询时会覆盖color.ui,例如git config --get-colorbool color.diff。我将我的color.diff 设置为auto,但git config --get-colorbool color.diff 没有为我打印任何内容。还有color.pager,我不确定这是否会覆盖其他设置,尽管我自己没有设置。
    【解决方案2】:

    首先,我也注意到在 bash 管道后缺少颜色,但是您对 decorations(分支和标签名称)消失的描述很奇怪。让我们分别解决它们。

    处理分支名称(装饰)本身

    --decorate
    

    是它的标志,一次性使用。

    对于永久效果,您可以在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!:-)) em>

    【讨论】:

    • 解释是运行 git 时没有告诉它是否需要颜色,git 会尝试查看您是否在虚拟终端(如控制台)上运行,以及是否没有通过管道输出或其他东西...如果是这种情况,它将诉诸使用颜色。
    • 我认为还有 --color/--no-color 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2019-04-03
    • 2010-12-22
    • 1970-01-01
    • 2022-12-03
    • 2012-12-06
    相关资源
    最近更新 更多