查找未注明日期的提交日期?

时间:2014-05-21 20:30:39

标签: git parsing github commit

我正在做一个git日志列出所有提交,然后解析它们。 使用此命令:

git log --encoding=UTF-8 --date=local --pretty=format:'%H,%P,%at,%ct,%an,%s'

在一些奇怪的回购中,我在提交者和提交日期都没有提交日期。 我试着用简单的方法:

git log

我得到的是1970年的日期。

发生这种情况的回购是SamWM/jQuery-Plugins,例如在提交e9dddaf24c9de45d9b4efdf38eff7c30eb200f48中。

虽然在GitHub中我们有一个有趣的约会时间。

任何人都可以帮助我获得一个有趣的约会,这个提交应该在其他地方的某个地方吗?

1 个答案:

答案 0 :(得分:4)

git show --format=raw显示:

commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48
tree d63aeb159635cb231e191505a95a129a3b4a7b38
parent 9276202f1c0dcc360433df222c90f7874558f072
author SamWM <sam@webmonkeysolutions.com> 1288370243 --700
committer SamWM <sam@webmonkeysolutions.com> 1288370243 --700

此处的时区信息无效,我不确定他是如何设法创建的。其他提交使用正确的-0700格式。

您可以使用GNU日期转换此内容,并知道--700应该是-0700

$ TZ=Etc/GMT+7 date -d @1288370243
Fri 29 Oct 09:37:23 GMT+7 2010

所以Git常用格式的正确答案是Fri 29 Oct 09:37:23 2010 -0700

注意:我使用的是TZ=Etc/GMT+7,而不是GMT-7。您可以通过使用具有正确时区信息的不同提交运行相同的命令来查看结果正是它应该是什么。 date的时区转换完全是错误的方式来解决这里所需要的,并且通过否定偏移量我正在抵消错误。

您可以在本地副本中使用git hash-objectgit replace修复此类提交。首先,检查我的命令是否正常:

$ git cat-file commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 |
> git hash-object -t commit -w --stdin
e9dddaf24c9de45d9b4efdf38eff7c30eb200f48

此命令加载指定的提交,未经修改将其写回,并显示重写的提交的哈希。我正在使用它作为一个完整性检查:如果我得到一个不同的哈希值,那么我的命令就会出错。

现在,可以插入一些东西来创建一个固定的提交:

$ git cat-file commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 |
> sed -e 's/--700/-0700/' |
> git hash-object -t commit -w --stdin
46694249ed3d519b0c934222520b9dc6d8557fa1

并改为使用固定提交:

$ git replace e9dddaf24c9de45d9b4efdf38eff7c30eb200f48 46694249ed3d519b0c934222520b9dc6d8557fa1

之后,对e9dddaf24c9de45d9b4efdf38eff7c30eb200f48的所有引用都会改为46694249ed3d519b0c934222520b9dc6d8557fa1git show e9dddaf24c9de45d9b4efdf38eff7c30eb200f48现在以:

开头
commit e9dddaf24c9de45d9b4efdf38eff7c30eb200f48
Author: SamWM <sam@webmonkeysolutions.com>
Date:   Fri Oct 29 09:37:23 2010 -0700

    Update version number, make text formatting and indentation consistent with the rest of the code