已经有一个问题询问如何在 Git 中找到提交的日期。但是,该问题的所有答案都使用git show
orgit log
命令,它们都是瓷器命令;瓷器命令的标准智慧似乎是它们的输出格式可能会改变,因此应尽可能避免在脚本中使用它们。
有没有办法只使用管道命令来获取 git 提交的时间戳?
提交对象的格式如下:
tree SP SHA_1_NAME_AS_HEX LF
parent SP SHA_1_NAME_AS_HEX LF
...
author SP any number of words SP <email_addr> SP TIMESTAMP SP TZ_OFFSET LF
committer SP any number of words SP <email_addr> SP TIMESTAMP SP TZ_OFFSET LF
LF
commit message LF
LF
extensive commit message
(其中SP
ASCII 空格字符 0x20 和LF
ASCII 换行符 0x0a)。
所以基本上要实现你想要的,你:
git cat-file commit <commitish_of_interest>
stdout
byLF
终止行的内容。author SP
。00:00
,其格式
为SHHMM
where S
is a sign-
或+
, 相应地定义偏移量在格林威治以西或以东的位置,以及HHMM
是时区的偏移量,以HH
小时和MM
分钟为单位。请注意,author
和committer
字段的内容仅在“正常”提交时相同。在重新提交提交时,至少时间戳可能会有所不同,并且如果提交是由实际创作提交(其作者)以外的人重新确定的,则字段将有所不同。对于通过git am
.
git cat-file -p HASH_OF_COMMIT
将返回提交 blob 的内容。因此,您将可以访问所有元数据,以及作者和创建日期。
Git 在正确区分管道和瓷器方面有点松懈。在脚本中使用管道命令的建议很好,但有时一个命令——例如——git log
没有合适的管道变体,但如果我能编一个词的话,它确实有使它“plumby”的选项。
在这种情况下,适当的命令是(编辑,2019 年 3 月 21 日,根据Josh 的评论):
git -c log.showSignature=false log --pretty=format:%ad --no-walk <hash>
(或与%cd
提交者日期的格式指令相同;将各种日期格式选项添加到git log
自身,或者%aD
例如更改日期格式)。没有什么确切的承诺git log
可能不会添加新功能,例如log.decorate
设置,这可能会破坏这一点,Git 应该自行处理并向--porcelain
行为类似的命令添加选项git status
。(请注意,git status
现在有--porcelain
and --porcelain=v2
,两者都将其转换为管道。不要问我为什么不拼写--plumbing
...)