是否有可能设置一个git的承诺有1970年之前的时间戳?是否有可能设置一个git的承诺有1970年之

2019-05-12 03:59发布

Unix的时间戳(64位在某些系统上的今天,还是让我明白了)签署的32个整数。 在某些软件产品,这使您可以使用日期可追溯到1903年左右会。

但是,当我尝试以下方法:

git commit -m "this is a test commit" --date="1960-04-07 18:00:00"

我收到一个“致命的:无效的日期格式”的错误。

这是不是很实用(我不是一个时间旅行者),但我一直都在怀疑使用Git历史的目的。 这可以用Git探测命令被强制? 在一个相关的说明:不混帐总是用一个32位的时间戳,或者这也取决于它的建成对环境的?

Answer 1:

早在提交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



Answer 2:

Git的内部维护日期为Unix的时间戳和UTC的偏移量,所以它是不可能的设置Unix时间纪元前提交日期。

您必须在运行不同版本的Git比我对我的CentOS 6.5系统(该系统提供的Git 1.7.1),至少你给你一个错误信息...如果我尝试设置使用Git 1.7不可能提交日期。如图1所示,提交成功,静静使用当前时间提交日期; 如果我尝试使用“可能”相同的操作提交日期,它成功并记录预期的提交日期。



Answer 3:

你可以保存它们,但没有什么能够让他们像你预期(还)。

内部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的模型意味着承诺,包括他们将生存在一个仓库不变。



Answer 4:

我只是用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命令,将正确解析这些时间戳(被他们走在这一点?!?!),请大家指正。



文章来源: Is it possible to set a git commit to have a timestamp prior to 1970?