我正在创建一些脚本和程序来获取提交信息
git log --pretty=<my format> -1 <commit>
我想知道这个命令的输出是适合程序解析(plumbing)还是只适合呈现给人(ceramine),例如,在一些项目中,我使用以下命令获取commit SHA + author name + commit summary:
git log --pretty="%H%n%an%n%s" -1 HEAD
然后用换行符分割输出字符串(我使用的是Linux)。
除此之外,在某些情况下我还会做这样的事情:
git log --pretty='[%h] %an: %s' -1 HEAD
然后使用下面的正则表达式解析结果,期望捕获的组中包含一个简短的SHA、作者名和提交摘要:
^\[(\w+)\] ([^:]+): (.*)$
这是一种好的方法吗?如果不是,那么通过编程获取提交信息的首选方法是什么?
4条答案
按热度按时间mv1qrgav1#
git log
是陶瓷命令。它实际上执行了相当多的不同任务-结合了遍历修订图、
git diff
和git grep
等。一个管道的方式来做一些事情
就是将
git show-ref
与git cat-file
组合起来,然后解析结果-类似于实际上,根Git的手册页
git(1)
--运行git help git
来阅读它--包含了将命令分解为陶瓷层和管道层的内容。bqjvbblv2#
我同意kostix;
git log
是一个瓷器命令,但这里的问题是,git log
可以做的一些事情是其他命令很难做的,所以有时我们可以让git log
* 像 * 一个管道命令一样。水管和瓷器之间的关键区别在比较时就显现出来了,例如
git branch
和git tag
对git for-each-ref
,或者git diff
对git diff-tree
和git diff-files
对git diff-index
。关键不在于每个水管有多少瓷器。例如,这里的水管git for-each-ref
有两个独立的瓷器前端。而单个前端git diff
有三个管道后端。不,关键是git diff
* 根据用户选择的配置项更改其行为 *:管道版本 * 忽略所有用户配置 *,因此您编写的脚本对Alice、Bob、Carol和Dave的行为相同,即使他们具有不同的设置。
当使用这个定义时,我们可以决定
git log
* 是否像 * 一个plumbing命令一样工作。这需要枚举所有的git log
配置选项。不幸的是,没有一个干净的方法来做到这一点--可以随时添加更多的选项,有些选项是随着时间的推移而添加的。这是我在
git log
和git config
手册中找到的一个列表,注意我省略了所有面向差异的提交(例如上面提到的color.diff
和diff.*
项),因为在git log
中有一些管道命令可以处理-p
的等价物(尽管你必须一次处理一个提交)。所以,假设我们想从某个特定的提交中获取提交者日期,并以某种特定的方式进行格式化,我们可以运行:
我们在
git log
的主文档中发现漂亮的%cd
是这样描述的:%cd:提交者日期(格式遵循--date=选项)
我们没有给予
--date=
选项,所以git log
将查找log.date
设置。这是一个用户配置选项,我们的git log
输出将取决于 * 用户 * 的选择,而不是我们的。要使
git log
* 像 * 管道命令一样工作,我们必须覆盖log.date
配置设置,例如使用--date=default
或-c log.date=default
:或:
理想情况下,Git应该有一个
plog
命令,定义为 * git log的plumbing variant *,或者一个git format-log-metadata
plumbing命令,接受--pretty=<directives>
选项并格式化日志元数据。因为它没有,所以需要git log --pretty=format:...
输出的脚本的编写者来确保他们知道可能影响他们的配置选项。nfs0ujit3#
感谢kostic和torek的回答。
不管他们怎么回答,我相信 * 一些 * 漂亮的格式选项可以被安全地视为管道(即程序可以安全地解析)。
%H
用于完全提交SHA%T
用于全树SHA%P
用于完整父SHA%an
、%cn
、%ae
、%ce
、%at
、%ct
表示作者/提交者姓名/电子邮件/日期(Unix)。此外,RFC 2822和ISO 8601样式的时间是可靠的%aD
、%cD
、%aI
、%cI
%s
用于提交摘要%G?
表示签名状态%n
用于新行(lol...)是的,虽然格式说明符如
%ad
和%cN
可能会受到用户设置的影响,但上面的说明符不太可能。因此,我认为我当前的代码是安全的,不容易出错,该代码使用上面说明符组合的漂亮格式解析git log
的输出。fd3cxomn4#
仅添加到kostix's answer:对于我来说,
git show-ref -s HEAD
不输出任何内容,返回退出代码1。取代:
我用途:
或: