我正在创建一些脚本和程序,以使用
来获取提交信息。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+)\] ([^:]+): (.*)$
这是一个好方法吗?如果没有,以编程方式获取有关提交信息的首选方式是什么?
答案 0 :(得分:3)
git log
是瓷器命令。
它实际上执行了许多不同的任务-结合遍历修订图git diff
和git grep
以及其他功能。
做点东西的管道方式
git log --pretty='[%h] %an: %s' -1 HEAD
是将git show-ref
与git 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)
我同意kostix; git log
是瓷器命令。但是这里的问题是,git log
可以完成某些其他命令无法完成的工作,因此有时我们可以使git log
的行为像那样成为管道命令。
比较时显示水暖和瓷器之间的主要区别,例如,将git branch
和git tag
与git for-each-ref
或将git diff
与git 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 log
和git log
手册找到的列表。请注意,我忽略了所有面向差异的参数(例如,上面提到的git config
和color.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
的输出)是安全且不易出错的。