无需“git”命令即可获取 git 提交详细信息

The*_*her -1 php git

首先,我看过并阅读过Git commit date

如何在执行任何“git”命令的情况下在 git repo 中获取当前 HEAD 提交的日期?示例:我正在从 PHP 执行命令exec,但无法调用,但我想获取当前提交的详细信息。

我可以访问这个 repo 的 .git 文件夹,但它似乎对提交细节没有用。我只能得到:

  • 当前分支来自 .git/HEAD
  • 当前提交 ID (SHA) 来自 .git/refs/heads/<branch>

但没有提交消息,也没有提交日期。有没有办法从文件集中获取它?

tor*_*rek 5

你不能。

好吧,你也许可以,但是有太多复杂的问题。

具体来说,每个 Git对象都存储在所有对象的数据库中,由哈希 ID 键索引。一些对象是松散的:存储为单独的文件。这样的文件是 zlib 压缩的。任何 zlib-inflator 都可以读取此文件并将压缩数据转换为可读、有用的数据,如果使用提交哈希 ID 执行此操作,您将看到的是实际提交对象内容:

$ git cat-file -p HEAD | sed 's/@/ /'
tree 1fd4a47af4942cbdee0bdcb4375612ab521a4a51
parent 5571d085b3c9c2aa9470a10bcf2b8518d3e4ec99
author Junio C Hamano <gitster pobox.com> 1531941857 -0700
committer Junio C Hamano <gitster pobox.com> 1531941857 -0700

Third batch for 2.19 cycle

Signed-off-by: Junio C Hamano <gitster pobox.com>
Run Code Online (Sandbox Code Playgroud)

(这里我使用 Git 命令来完成这项工作,这违反了您的规则。)日期是authorcommitter行上的两个时间戳。您可以根据自己的喜好简单地解码它们,但请记住在-0700这里也使用时区偏移量。(内部内容以标题为前缀,在本例中为commit <size>\0,因为所有 Git 对象都有标题。)

松散并不是存储对象的唯一方式。一旦对象已经躺在附近宽松了一会儿,Git会最终收拾对象变成一个包文件。包文件的格式相当复杂。它记录在案——请参阅Git 技术文档文件——但它可能会发生变化,并且在git cat-file -p已经为您完成所有工作时不值得编码。

因此,只需使用 Git 命令即可。这确实意味着您需要安装 Git,但无论如何您可能都需要它。