“ git log --pretty = <pretty format =“”>”是瓷器或管道命令吗?

时间:2018-12-02 15:33:25

标签: git git-log

我正在创建一些脚本和程序,以使用

来获取提交信息。
git log --pretty=<my format> -1 <commit>

我想知道此命令的输出是否适合由程序解析(管道)或仅打算呈现给人类(瓷器)。例如,在某些项目中,我使用以下命令获取提交SHA +作者名+提交摘要:

git log --pretty="%H%n%an%n%s" -1 HEAD

然后我用换行符分割输出字符串(我在Linux上)。

此外,在某些情况下,我还会执行以下操作:

git log --pretty='[%h] %an: %s' -1 HEAD

然后使用以下正则表达式解析结果,期望捕获的组中包含简短的SHA,作者姓名和提交摘要:

^\[(\w+)\] ([^:]+): (.*)$

这是一个好方法吗?如果没有,以编程方式获取有关提交信息的首选方式是什么?

3 个答案:

答案 0 :(得分:3)

git log是瓷器命令。

它实际上执行了许多不同的任务-结合遍历修订图git diffgit grep以及其他功能。

做点东西的管道方式

git log --pretty='[%h] %an: %s' -1 HEAD

是将git show-refgit cat-file结合起来并解析结果-类似于

git cat-file commit `git show-ref -s HEAD` |
  while read line; do
    # do some processing
  done

实际上,根Git的手册页git(1)(运行git help git进行阅读)包含将命令细分为瓷器和管道层的情况。

答案 1 :(得分:2)

我同意kostixgit log是瓷器命令。但是这里的问题是,git log可以完成某些其他命令无法完成的工作,因此有时我们可以使git log的行为像那样成为管道命令。

比较时显示水暖和瓷器之间的主要区别,例如,将git branchgit taggit for-each-ref或将git diffgit diff-tree和{{ 1}}和git diff-files。每个管道中没有多少瓷器。例如,此处的管道git diff-index具有两个独立的瓷器前端,而单个前端git for-each-ref具有三个管道后端。不,关键是git diff 根据用户选择的配置项更改其行为

git diff

,依此类推。管道版本忽略所有用户配置,因此您编写的脚本对于Alice,Bob,Carol和Dave的行为相同,即使它们具有不同的设置。

使用此定义时,我们可以确定diff.algorithm diff.dirstat diff.renameLimit diff.renames diff.statGraphWidth diff.submodule 的行为是否类似于管道命令。这需要枚举所有git log配置选项。不幸的是,没有做到这一点的干净方法-随时可以添加更多选项,并且随着时间的推移已经添加了一些。

这是我通过查阅git loggit log手册找到的列表。请注意,我忽略了所有面向差异的参数(例如,上面提到的git configcolor.diff项目),因为在diff.*中有管道命令可以处理-p的等效项(尽管您必须一次完成一次提交)。

git log

因此,假设我们要从某种特定的提交中获取提交日期,并以某种特定的方式进行格式化。为此,我们可以运行:

color.decorate.<slot>
core.notesRef
format.pretty
i18n.logOutputEncoding
log.abbrevCommit
log.date
log.decorate
log.follow
log.graphColors
log.mailmap
log.showRoot
log.showSignature
notes.displayRef
pretty.<name>

我们在主要的git log --no-walk --pretty=format:%cd 文档中发现以这种方式描述了漂亮的格式git log

  

%cd:提交者日期(格式方面--date =选项)

我们没有提供%cd选项,因此--date=将查找git log设置。这是一个用户配置选项,我们的log.date输出将取决于用户的选择,而不是我们的选择。

要使此git log的行为像的管道命令,那么,我们必须使用git log或{{ 1}}:

log.date

或:

--date=default

理想情况下,Git应该具有定义为git log的 plumbing变体-c log.date=default命令,或具有git -c log.date=default log --no-walk --pretty=format:%cd 的{​​{1}}探测命令选项和格式记录元数据。既然没有,那么由编写脚本的人来决定,这些脚本需要git log --no-walk --date=default --pretty=format:%cd 输出,以确保他们知道可能影响他们的配置选项。

答案 2 :(得分:0)

感谢kostic和torek的回答。

尽管他们回答了什么,但我相信 some 的漂亮格式选项可以安全地视为管道(即可以安全地由程序解析)。例子包括

  • %H用于完全提交SHA
  • %T用于全树SHA
  • %P(用于完整的父SHA)
  • %an%cn%ae%ce%at%ct(作者/提交者名称/电子邮件/日期(Unix)) 。 RFC 2822和ISO 8601样式时间也是可靠的%aD%cD%aI%cI
  • %s提交摘要
  • %G?获取签名状态
  • %n换行(大声笑...)

是的,尽管诸如%ad%cN之类的格式说明符可能会受到用户设置的影响,但上述设置不太可能受到用户设置的影响。因此,我认为我目前的代码(使用上述说明符组合的漂亮格式来解析git log的输出)是安全且不易出错的。