Git存储提交历史记录的文件是哪个? Git用什么文件存储提交历史记录?

9

我想从git存储提交历史的文件中读取每个提交的信息,并将其存储到我的项目数据库中,在我的项目视图中显示所有历史记录。

2个回答

15

没有一个单独的文件可以查询提交历史记录。有很多关于git对象模型的好的解释(例如计算机科学家的Git, Pro Git, Git社区书),但在这里提供一个快速的解释可能会有帮助:

Git中有各种类型的对象,最重要的是:

  • blob(文件)-只是二进制文件
  • tree(目录)-树是其他对象(通常是blob和tree)的列表,包括它们的名称、哈希和有限的权限
  • commit(版本)-每个提交都包括其父提交的哈希、作者、提交消息和其他元数据
每个对象都由其内容的哈希标识,这个哈希被称为对象名 - 这些是你在使用git时可能看到的40位十六进制字符串。每个对象都存储在.git/objects/目录中,可以作为松散对象(每个文件一个)或作为打包文件中存储的众多对象之一进行存储。文件.git/HEAD表示您的存储库当前所在的版本,并通常包含对特定分支的引用,该分支由.git/refs/heads下的文件或存储在打包文件中的引用表示。(HEAD也可能直接指向特定提交的对象名称。)其中一个代表分支的文件,例如.git/refs/heads/master,只包含一个对象名称。
为了从此分支末端遍历历史记录,git将在对象数据库中找到该文件中命名的对象,并递归地跟随指向其父项的指针。
然而,对于您所描述的使用情况(即遍历历史记录以导出它),我强烈建议您执行以下操作之一:
  • 调用git命令来查找历史记录。如果您坚持使用所谓的“plumbing”命令,则它们的输出应在git版本间保持稳定。
  • 使用libgit2库来查询存储库。libgit2是一个完全可重入的库,用于查询git存储库,现在已经有很多语言的绑定。

你缺少了第四个对象:标签。 - wilhelmtell
@wilhelmtell:这正是我说“Git中有各种类型的对象,最重要的是[...]”的原因。 - Mark Longair
嘿,我在搜索如何撤销提交时发现了你的答案。我有一个问题,当我撤销提交时,Git会解密我的提交哈希值,然后找到我的文件吗? - Murad Sofiyev

4
你可以从这里了解git如何存储对象:Git对象的存储机制。阅读该书籍中“内部原理和基础”部分的其他章节,以了解它是如何工作的。
基本上,不存在“存储提交历史记录的文件”,它比这更复杂。你应该使用你所选语言的现有API之一(搜索“git API”和你的语言,有很多可用的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接