3

已经有一个问题询问如何在 Git 中找到提交的日期。但是,该问题的所有答案都使用git showorgit log命令,它们都是瓷器命令;瓷器命令的标准智慧似乎是它们的输出格式可能会改变,因此应尽可能避免在脚本中使用它们。

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

4

3 回答 3

5

提交对象的格式如下:

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)。

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

  1. 称呼git cat-file commit <commitish_of_interest>
  2. 迭代该程序转储到其stdout byLF终止行的内容。
  3. 在以 开头的行停止author SP
  4. 将其拆分为空格,然后取最后两个字段。第一个是自第二个字段定义的时区以来的秒数00:00,其格式 为SHHMMwhere Sis a sign-+, 相应地定义偏移量在格林威治以西或以东的位置,以及HHMM是时区的偏移量,以HH小时和MM分钟为单位。
  5. 处理这两个字段的值以格式化时间戳。

请注意,authorcommitter字段的内容仅在“正常”提交时相同。在重新提交提交时,至少时间戳可能会有所不同,并且如果提交是由实际创作提交(其作者)以外的人重新确定的,则字段将有所不同。对于通过git am.

于 2018-10-08T20:19:31.653 回答
2

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

于 2018-10-08T19:44:08.327 回答
1

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...)

于 2018-10-08T20:36:01.413 回答