我试图通过命令行获得一些有关git提交的信息,作为我正在构build的一个更大的自动化工具的一部分。 我想要的信息可以通过这个git log命令获得:
git log --branches --graph --oneline --parents
它产生这个输出:
这太好了,因为它具有我想要的哈希和标签,以及提交消息。 但是,当我把这个文件传给一个文件的时候,括号内的内容似乎不知怎么就丢了。 我对颜色不是太感兴趣,但是我确实需要纯文本,就像我期望从任何类似nix的程序那样。
这是我似乎得到的输出,它省略了一些我想要的输出(例如,标记信息):
我不知道如何或为什么这个信息在pipe道上丢失。 我觉得这可能是非常简单明显的事情。
我遇到了同样的问题,无论是在Arch Linux上的Bash(使用最新版本的git)还是在Windows中的MINGW64 Bash环境中都这样做。
问题:如何在不丢失pipe道到文件时丢失的信息的情况下,完全捕获git日志的输出?
您需要将--decorate选项添加到您的日志命令。 将其设置为--decorate=short或--decorate=full 。
它出现在你的configuration中,你可能已经把log.decorate设置为auto ,这意味着当写入到terminal时,标签等被显示( short ),而不是pipe道或其他文件。
类似地,configuration值和命令选项pipe理是否输出颜色代码(以及何时)。 所以
git log --branches --graph --oneline --parents --decorate=short --color=always
即使redirect到文件也会输出标签和颜色。
请注意,编写脚本时,您应该在命令行中包含这些选项,而不是对设置的configuration值进行假设。 根据你对输出做什么, log可能是也可能不是用在脚本中的最好命令,因为git命令有些分为人类消耗和脚本。
你的git命令:
git log --branches --graph --oneline --parents
不会为您在第一个示例中显示的输出生成相同的输出。 但是,它确实产生类似于第二个例子的输出。 括号(分支和标签)中的ref名称在添加--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文档以了解相关格式 。 特别是,查找%C格式和%C(auto,…)表示法,只有当命令从terminal运行时,才会使用颜色控件。
如果你总是想要生成颜色信息,而不pipe你是否使用交互式的git log ,你可以在上面的行(或别名)中删除每个auto, 。