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

时间:2018-10-08 19:01:43

标签: git scripting git-plumbing

已经有一个question询问如何在Git中查找提交的日期。但是,该问题的所有答案都使用porcelain commandsgit showgit log命令。关于瓷器命令的标准观点似乎是output format may change,因此应尽可能避免在脚本中使用它们。

有没有一种方法可以仅使用管道命令来获取git commit的时间戳?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

提交对象的格式如下:

   <CheckBox
       android:id="@+id/settings_hide_nsfw_thumbnails"
       android:layout_width="wrap_content"
       android:layout_height="match_parent" />

(其中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 是ASCII空格字符0x20,而SP是ASCII换行字符0x0a)。

因此,基本上要实现您想要的目标,您:

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

请注意,HHMM字段的内容仅在“正常”提交时相同。在重新提交的提交中,至少时间戳可能有所不同,并且如果某个提交是由实际编写该提交的人(其作者)以外的其他人重新提交的,则字段将有所不同。对于通过author通过补丁创建的提交,也是如此。

答案 2 :(得分:1)

Git在适当地区分管道和瓷器方面有些松懈。在脚本中使用管道命令的建议是好的,但是有时命令(例如git log)没有适当的管道变体,但是确实具有使它成为“ plumby”的选项。 ,如果我能补个字。

在这种情况下,适当的命令是(根据comment from Josh,于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 ...)