为什么管道从 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 设置是默认设置 — 您可以将其更改为 always
或 never
— 告诉 Git:当命令将其输出写入终端时,执行此操作,但如果不执行此操作(如 git branch | grep ...
中写入管道时),则不要执行此操作。
log.decorate
选项控制 (master)
装饰。特定文本是否有颜色,如果有,用什么颜色,由相当复杂的选项迷宫控制,这些选项仅 starts with color.ui
.
将 color.ui
设置为 always
将破坏 运行 管道中瓷器命令的原始脚本,并期望 color.ui
设置为其默认值 auto
。 None 个 Git 自己的脚本像这样天真,但您可能正在使用自己的扩展,或者从没有考虑过该问题的人那里获得的扩展,因此在覆盖这些默认值时要小心.
(顺便说一句,注意设置中的=
。例如,.git/config
和git -c color.ui=true log
中需要这些,但在git config log.decorate auto
中是禁止的。这是历史文物和当时权宜之计的疯狂大杂烩。)
当我运行
> 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 设置是默认设置 — 您可以将其更改为 always
或 never
— 告诉 Git:当命令将其输出写入终端时,执行此操作,但如果不执行此操作(如 git branch | grep ...
中写入管道时),则不要执行此操作。
log.decorate
选项控制 (master)
装饰。特定文本是否有颜色,如果有,用什么颜色,由相当复杂的选项迷宫控制,这些选项仅 starts with color.ui
.
将 color.ui
设置为 always
将破坏 运行 管道中瓷器命令的原始脚本,并期望 color.ui
设置为其默认值 auto
。 None 个 Git 自己的脚本像这样天真,但您可能正在使用自己的扩展,或者从没有考虑过该问题的人那里获得的扩展,因此在覆盖这些默认值时要小心.
(顺便说一句,注意设置中的=
。例如,.git/config
和git -c color.ui=true log
中需要这些,但在git config log.decorate auto
中是禁止的。这是历史文物和当时权宜之计的疯狂大杂烩。)