【问题标题】:Get git commit details without "git" command在没有“git”命令的情况下获取 git 提交详细信息
【发布时间】:2018-08-14 02:17:17
【问题描述】:

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

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

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

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

但是没有提交信息和提交日期。有没有办法从文件集中获取它?

【问题讨论】:

  • 使用 PHP 库访问 git 仓库怎么样?我确信 libgit2 会有一些 PHP 绑定。

标签: php git


【解决方案1】:

你不能。

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

具体来说,每个 Git object 都存储在所有对象的数据库中,由 hash-ID 键索引。有些对象是松散的:存储为单独的文件。这样的文件是 zlib-deflate 的。任何 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>

(这里我使用了一个 Git 命令来完成这项工作,这违反了你的规则。)日期是 authorcommitter 行上的两个时间戳。您可以随意解码它们,但请记住在此处也使用时区偏移量-0700。 (内部内容以标头为前缀,在本例中为 commit &lt;size&gt;\0,因为所有 Git 对象都有标头。)

松散并不是存储对象的唯一方式。一旦一个对象闲置了一段时间,Git 最终会将对象 pack 放入一个 pack 文件。包文件的格式相当复杂。它记录在案 - 请参阅 the Git technical documentation file - 但它可能会发生变化,并且当 git cat-file -p 已经为您完成所有工作时,不值得编码。

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

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 2013-03-05
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多