如何仅使用管道命令查找 git 提交的日期?

How do I find the date of a git commit using only plumbing commands?

已经有 question asking how to find the date of a commit in Git. However, all the answers to that question make use of the git show or git log commands, which are both ; the standard wisdom on porcelain commands seems to be that their output format may change,因此应尽可能避免在脚本中使用它们。

有没有办法仅使用管道命令获取 git 提交的时间戳?

git cat-file -p HASH_OF_COMMIT 将 return 提交 blob 的内容。 因此,您将可以访问所有元数据,以及作者和创建日期。

提交对象的格式如下:

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 space 字符,0x20,LF 是一个 ASCII 换行符,0x0a)。

所以基本上要实现你想要的,你:

  1. 致电git cat-file commit <commitish_of_interest>
  2. 遍历该程序转储到其 stdout 的内容 通过 LF 终止行。
  3. 停在以 author SP 开头的行。
  4. 在 spaces 上拆分它,并取最后两个字段。 第一个是第二个字段定义的时区中自 00:00 以来的秒数,其格式为 SHHMM 其中 S 是一个符号,-+,它相应地定义了格林威治以西或以东的偏移量,并且 HHMM 是时区的偏移量,以 HH 小时和 MM 分钟为单位。
  5. 处理这两个字段的值以格式化时间戳。

请注意,authorcommitter 字段的内容仅在 "normal" 提交时相同。在 rebased 提交上,至少时间戳可能不同,如果提交是由实际编写提交(其作者)以外的人 rebased,则字段将不同。对于通过 git am.

从补丁创建的提交也是如此

Git 在正确区分管道和瓷器方面有点松懈。在脚本中使用管道命令的建议很好,但有时命令(例如 git log)没有合适的管道变体,但 有使其成为可能的选项"plumby",如果我能凑个字

在这种情况下,适当的命令是(编辑,2019 年 3 月 21 日,根据 ):

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--porcelain=v2,两者都将其转换为管道。不要问我为什么不拼写 --plumbing...)