Unix的时间戳(64位在某些系统上的今天,还是让我明白了)签署的32个整数。 在某些软件产品,这使您可以使用日期可追溯到1903年左右会。
但是,当我尝试以下方法:
git commit -m "this is a test commit" --date="1960-04-07 18:00:00"
我收到一个“致命的:无效的日期格式”的错误。
这是不是很实用(我不是一个时间旅行者),但我一直都在怀疑使用Git历史的目的。 这可以用Git探测命令被强制? 在一个相关的说明:不混帐总是用一个32位的时间戳,或者这也取决于它的建成对环境的?
早在提交c64b9b8 (GIT 0.99,2005年5月),时间一直被称为
<date>
日期“因为秒时代 ”
提交6eb8ae0定义日期作为一个unsigned long
自2005年4月。
TLDR;
Unix纪元前的日期可以储存,但不能肯定被正确地表示。
但是,这并从2014年开始发展(见末)
试图代表之前之前已尝试的日期:看到这个线程
我想设置的日期是1958年10月4日,也就是围绕时间戳-354808800。
第一种方法,使用提交--date
与ISO 8601的标志:它说:“ invalid date
”。
第二技术中,在所描述的git毫升存档 ,不使用瓷:
git commit
git cat-file -p HEAD > tmp.txt
# at this point, edit the file to replace the timestamp
git hash-object -t commit -w tmp.txt
#=> 2ee8fcc02658e23219143f5bcfe6f9a4615745f9
git update-ref -m 'commit: foo' refs/heads/master \
2ee8fcc02658e23219143f5bcfe6f9a4615745f9
提交日期是有效更新,但git show
夹日期为零( Jan 1 1970
)。 tig(1)
显示55 years ago
,因此实际提交日期妥善保存。
最后一个问题:试图推动这一承诺远程仓库时:
#=> remote: error: object 2ee8fcc02658e23219143f5bcfe6f9a4615745f9:invalid
# author/committer line - bad date
#=> remote: fatal: Error in object
#=> error: unpack failed: index-pack abnormal exit
最后,运行时, test-date
由混帐来源:
./test-date show -354808800
#=> -354808800 -> in the future
在当时的讨论中提到:
我不知道有没有一些unportability在最低水平。
我们能够轻松地长期在低级别的日期代码time_t的和无符号之间的交流。 它可能发生在工作,因为铸造位来回符号和无符号类型之间通常工作,只要你最终得到你想要的类型。
但它不一定是便携式的,并且可以有微妙的错误。 见,例如,我最近9ba0f033 。
好消息,这纯粹是一个代码问题。 数据格式是好的。 它只是需要有人去执行代码和开关所有的“ unsigned long
”为“ long long
”(或time_t
,甚至是“ gittime_t
”如果我们想将它抽象)。
和固定至少在分析器算法tm_to_time_t()
这不仅是“ sed s/unsigned long/long long
”,而是检查每一个变化,以确保你没有引入新的错误,并且该代码正确处理符号类型。
这就是为什么没有人这样做。 ;)
正如我在2017年中提到,“ 同时使Git修订使用未来的日期 ,GIT中已开始采取不同的,奉献”的timestamp_t
类型。
如图所示在Legilibre / Archeo -莱克斯问题47 :
现在的日期使用的timestamp_t
类型,定义为typedef uintmax_t timestamp_t;
在地方的unsigned long
型,以解决某些问题上的32位平台...和Windows 64位^^。
该项目archeo-lex.fr (取决于较旧的日期)被使用Git哈希对象,结合Git的回购观众Legilibre/Archeo-Lex-web
。
这是现在(2019年2月)进行,如评论由Seb35
Git的内部维护日期为Unix的时间戳和UTC的偏移量,所以它是不可能的设置Unix时间纪元前提交日期。
您必须在运行不同版本的Git比我对我的CentOS 6.5系统(该系统提供的Git 1.7.1),至少你给你一个错误信息...如果我尝试设置使用Git 1.7不可能提交日期。如图1所示,提交成功,静静使用当前时间提交日期; 如果我尝试使用“可能”相同的操作提交日期,它成功并记录预期的提交日期。
你可以保存它们,但没有什么能够让他们像你预期(还)。
内部GIT中格式存储提交数据作为数字串。 例如:
$ git cat-file -p aa2706463fdeb51d6f9d0e267113b251888cf7f5
...
author Junio C Hamano <gitster@pobox.com> 1383318892 -0700
committer Junio C Hamano <gitster@pobox.com> 1383318892 -0700
我不相信它的要求,这一数字是正的。 然而,大多数实现方式中,包括git
,解析它作为一个无符号数,并且将无法正确显示这些日期。 例如, 在builtin/blame.c
:
*time = strtoul(ident.date_begin, NULL, 10);
所以; 使用负的时间是不是你可以很容易做到与现有的工具,或与当前的工具显示,但Git的模型意味着承诺,包括他们将生存在一个仓库不变。
我只是用git哈希对象重组后四周,创建以下commit对象:
tree 5efb9bc29c482e023e40e0a2b3b7e49cec842034
author x <x@x.com> -134607600 -0500
committer z <z@z.com> 1402404632 -0600
blah blah
你会注意到,当时提交日期设置为负数。 然后我用的git更新裁判尝试在...没有运气的提交对象链接,我得到下面的输出,当我做一个git日志:
$ git log
commit 2303e7012001a3cc1c3dec806d0902008e1257a8
Author: x <x@x.com>
Date: (null)
blah blah
Sourcetree同样困惑:
Parents:
Author: x <x@x.com>
Date: Monday, January 01, 0001 12:00:00 AM
Committer: z <z@z.com>
Commit Date: Tuesday, June 10, 2014 7:50:32 AM
(我想我忘了,包括父commit对象...)
同样,在不远的将来日期不工作,要么(这表明它可能不是这当作一个64位的值,即使它是一个)。
我不知道,如果这个答案有资格作为“不,你不能这样做”或“你可以,但它不能很好地工作。” 人们会需要一个修改客户端能够看到git的日志与正确的日期,消除任何可能的好处这一点。 如果有人知道一个漂亮的git log命令,将正确解析这些时间戳(被他们走在这一点?!?!),请大家指正。