已经有一个问题询问如何在 Git 中找到提交的日期。但是,该问题的所有答案都使用git showorgit 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
(其中SPASCII 空格字符 0x20 和LFASCII 换行符 0x0a)。
所以基本上要实现你想要的,你:
git cat-file commit <commitish_of_interest>stdout
byLF终止行的内容。author SP。00:00,其格式
为SHHMMwhere Sis 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现在有--porcelainand --porcelain=v2,两者都将其转换为管道。不要问我为什么不拼写--plumbing...)