如何仅使用管道命令查找 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)。
所以基本上要实现你想要的,你:
- 致电
git cat-file commit <commitish_of_interest>
- 遍历该程序转储到其
stdout
的内容
通过 LF
终止行。
- 停在以
author SP
开头的行。
- 在 spaces 上拆分它,并取最后两个字段。
第一个是第二个字段定义的时区中自
00:00
以来的秒数,其格式为
SHHMM
其中 S
是一个符号,-
或 +
,它相应地定义了格林威治以西或以东的偏移量,并且 HHMM
是时区的偏移量,以 HH
小时和 MM
分钟为单位。
- 处理这两个字段的值以格式化时间戳。
请注意,author
和 committer
字段的内容仅在 "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
...)
已经有 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
有没有办法仅使用管道命令获取 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)。
所以基本上要实现你想要的,你:
- 致电
git cat-file commit <commitish_of_interest>
- 遍历该程序转储到其
stdout
的内容 通过LF
终止行。 - 停在以
author SP
开头的行。 - 在 spaces 上拆分它,并取最后两个字段。
第一个是第二个字段定义的时区中自
00:00
以来的秒数,其格式为SHHMM
其中S
是一个符号,-
或+
,它相应地定义了格林威治以西或以东的偏移量,并且HHMM
是时区的偏移量,以HH
小时和MM
分钟为单位。 - 处理这两个字段的值以格式化时间戳。
请注意,author
和 committer
字段的内容仅在 "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
...)