当使用管道符号将git log的输出导入到文件中时,输出会丢失 - 我错过了什么?

15

我正在构建一个自动化工具,并尝试通过命令行获取一些有关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的输出,而不会丢失管道到文件时丢失的信息?


1
将 stderr 也重定向到 stdout:2>&1 - Gerald Schneider
1
为什么上面的评论被点赞了,当它事实上并不是问题的解决方案,即使通过最简单的测试也可以证明,并得到了文档的确认? - Mark Adelsberger
git检测到其标准输出不是终端时,它的行为可能会有所不同。然而,还有其他事情正在发生,因为您不应该在命令中没有--decorate选项的情况下获得该输出。 - chepner
3
@chepner - “something else” 就是将 log.decorate 配置值设置为 auto,非常简单。 - Mark Adelsberger
2个回答

18

你需要将 --decorate 选项添加到你的日志命令中。可以设置 --decorate=short--decorate=full

根据你的配置,似乎已经将 log.decorate 设置为 auto,这意味着当写入终端时会显示标签等内容(以 short 形式),但不会在管道或其他文件中显示。

同样地,还有一些配置值和命令选项,控制是否(以及何时)输出颜色代码;因此

git log --branches --graph --oneline --parents --decorate=short --color=always

即使重定向到文件中,仍应输出标签和颜色。

请注意,在编写脚本时,您应该在命令行中包含这些选项,而不是假设配置值设置了什么。根据您对输出的处理方式,log可能并不是在脚本中使用的最佳命令,因为git命令有一些针对人类消费而设计的,也有一些针对脚本编写而设计的。


-2

你的git命令:

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

对我来说,does not produce the same output for me that you show in your first example.这个命令并没有产生你在第一个例子中展示的相同输出。但是,它确实会产生类似于第二个例子的输出。当你添加--decorate选项时,方括号(分支和标签)中的引用名称将被包含在内。(这里是文档。

请注意,你的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文档中的pretty-formats以获取详细信息。特别是要查找%C格式和%C(auto,…​)符号,它仅在从终端运行命令时才使用颜色控制。

如果您始终希望生成颜色信息,而不管是否交互地使用git log,则可以删除上述行(或别名)中的每个auto,出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接