git如何告诉远程存储库提交的时间



如果你在GitHub上查看每次提交的时间,然后运行git log,你会发现远程和本地repo之间的提交时间完全相同,即使你在git commit之后几分钟运行git push。git如何告诉存储库上述提交的时间?

一旦您为该提交运行git commit,就会记录时间。推送仅使用本地提交更新github,因此不保留推送的时间。

编辑:如果您询问具体的机制,那么时间只会随着提交、更改、消息和作者/贡献者一起传递。

让我们看看实际提交的内部。以下是Git存储库中针对Git本身的提交:

$ git cat-file -p HEAD | sed 's/@/ /'
tree 8f78544663a8f3e9e3d4ee9125cf54a863498bfb
parent b4e245a17adc1b336269f7350e88eede6e713157
author Junio C Hamano <gitster pobox.com> 1605735205 -0800
committer Junio C Hamano <gitster pobox.com> 1605735205 -0800
Sixth batch
Signed-off-by: Junio C Hamano <gitster pobox.com>

任何提交的组件都是:

  • 每个文件的完整快照:这是通过tree行间接存储的
  • 元数据,包括提交人的姓名:在这里,我们可以在author行看到一些元数据,在committer`行看到一些

元数据包括提交的父级的原始哈希ID;这里,有一个父级,其散列ID显示在(单个(parent行上。元数据可以包括额外的标题行,但在这里,在标准treeparentauthorcommitter之后,我们只看到主题(Sixth batch(和正文,由第一组标题行之后的空行抵消。

(间接存储tree的一个原因是Git可以重用它。例如,一个不更改任何内容的合并提交,或者一个撤消前一次提交的恢复,将生成一个与前一次快照完全匹配的新快照。在这里,Git可以存储新提交,而不添加除新提交对象之外的任何内容。(

正如kevin robb所说,日期和时间戳是承诺本身的一部分。这些编码有点奇怪:自1970年1月1日00:00:00UTC以来,它们以秒的形式出现。这里是1605735205秒,或者Wed Nov 18 21:33:25 UTC 2020。我们还得到了一个时区偏移:-0800。这是以小时和分钟表示的,以十进制表示,每个数字有两位,因此偏移量为格林尼治以西8小时,即太平洋标准时间。从晚上9点33分开始,花了8个小时,我们得到了下午1点33分,这确实是git log显示的:

$ git log -n 1 | sed 's/@/ /'
commit faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
Author: Junio C Hamano <gitster pobox.com>
Date:   Wed Nov 18 13:33:25 2020 -0800
Sixth batch

Signed-off-by: Junio C Hamano <gitster pobox.com>

因为上面的,并且将始终是哈希ID为faefdd61ec7c7f6f3c8c9907891465ac9a2a1475的提交的确切数据,所以该提交的时间戳必须是我们刚刚看到的值:

$ (printf 'commit 279'; git cat-file -p HEAD) | shasum
faefdd61ec7c7f6f3c8c9907891465ac9a2a1475  -

(279是由git cat-file -p HEAD | wc -c找到的提交数据中的字节数(。

如果我们接受这个提交并将其更改为包含其他日期和时间戳,并通过Git的对象哈希器运行它,我们将获得其他哈希——一个哈希ID为而不是faefdd61ec7c7f6f3c8c9907891465ac9a2a1475的提交。提交faefdd61ec7c7f6f3c8c9907891465ac9a2a1475的日期为1605735205 -0800。因此,任何提交了faefdd61ec7c7f6f3c8c9907891465ac9a2a1475的Git存储库都带有日期和时间,而没有其他日期和时间。

最新更新