管道传输到git日志的输出会丢失 - 我错过了什么?

时间:2017-11-21 13:41:18

标签: bash command-line-interface git pipe stdout

我正在尝试通过命令行获取有关git提交的一些信息,作为我正在构建的更大自动化工具的一部分。我想要的信息可以通过这个git log命令获得:

git log --branches --graph --oneline --parents

产生这个输出:

enter image description here

这很棒,因为它具有我想要的散列和标记,以及提交消息。但是,当我将它传递给一个文件时,括号中的东西似乎以某种方式丢失了。我对颜色不太感兴趣,但我确实只想要纯文本,就像我期望的任何类似* nix的程序一样。

这是我似乎得到的输出,它省略了我想要的一些输出(例如,标签信息):

enter image description here

我不知道在某处管道传输时这些信息是如何或为何会丢失的。我觉得这可能是非常简单和明显的事情。

我是否在使用Arch Linux上的Bash(使用最新版本的git)或在Windows中的MINGW64 Bash环境中执行此操作时遇到同样的问题。

问题:如何在不丢失管道到文件时丢失的信息的情况下完全捕获git log的输出?

2 个答案:

答案 0 :(得分:5)

您需要在日志命令中添加--decorate选项。将其设置为--decorate=short--decorate=full

在您的配置中,您可能已将log.decorate设置为auto,这意味着在写入终端时会以short形式显示标签等,但不是管道或其他文件。

同样,有配置值和命令选项可以控制是否输出颜色代码(以及何时);所以

git log --branches --graph --oneline --parents --decorate=short --color=always
即使重定向到文件,

也会输出标签和颜色。

请注意,在编写脚本时,您应该在命令行中包含这些选项,而不是假设设置了哪些配置值。根据您对输出的处理方式,log可能是也可能不是最好的脚本编写命令,因为git命令在某种程度上分为用于人类消费的命令和用于脚本编写的命令。

答案 1 :(得分:-1)

你的git命令:

git log --branches --graph --oneline --parents

不会为您在第一个示例中显示的输出产生相同的输出。但是,它确实产生类似于第二个例子的输出。添加--decorate选项时,括号(分支和标记)中的引用名称将包含在内。 (Here's the documentation.

请注意,您的git日志格式可以在~/.gitconfig文件中进行控制。例如,您在问题中显示的格式看起来可能通过以下选项实现:

git log --decorate --graph --all --format='%C(auto,yellow)%h%C(auto,reset) %C(auto,yellow)%p%C(auto,reset) %C(auto,red)%d%C(auto,reset) %s %C(auto,green)%an%C(auto,reset) (%C(auto,cyan)%ar%C(auto,reset))'

如果您尝试自动化,可以指定一种更符合您要求的格式。有关详细信息,请查看git documentation for pretty-formats。特别是,查找%C格式和%C(auto,…​)表示法,只有在从终端运行命令时才会使用颜色控件。

如果您始终想要生成颜色信息,无论您是否以交互方式使用git log,都可以删除上述行(或别名)中auto,的每个错误。