git在哪个文件中存储提交历史



我想从git存储提交历史的文件中读取,将每个提交信息存储在我的项目的DB中,并在我的项目视图中显示所有历史

您无法查询单个文件以获取提交历史。关于git的对象模型有很多很好的解释(例如git for computer scientist, Pro git, git community book),但是在这里做一个简短的解释可能会很有用:

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

  • blobs (files) -只是二进制文件
  • trees(目录)—树是其他对象(通常是blob和树)的列表,包含它们的名称,散列和有限的权限集
  • 提交(版本)-每个提交包括父提交的哈希值,作者,提交消息和其他元数据

每一个都通过其内容的哈希值来标识,这个哈希值被称为对象名称——这些是40位十六进制字符串,你可能在使用git的过程中看到过。每个对象都存储在.git/objects/目录中,或者作为松散对象(每个文件一个对象),或者作为有效存储在包文件中的众多对象之一。文件.git/HEAD表示存储库当前的版本,通常包含对特定分支的引用,由.git/refs/heads下的文件或存储在包文件中的引用表示。(HEAD也可以直接指向特定提交的对象名称。)其中一个代表分支的文件,比如.git/refs/heads/master,只包含一个对象名称。

为了从这个分支提示遍历历史,git将在对象数据库中找到该文件中命名的对象,并递归地遵循指向其父的指针。


然而,对于您所描述的用例(即遍历历史以导出它),我强烈建议您执行以下操作之一:

  • 调用git命令查找历史记录。如果你坚持使用所谓的"管道"命令,它们的输出在不同的git版本中应该是稳定的。
  • 使用libgit2库询问存储库。libgit2是一个完全可重入的库,用于查询git存储库,现在有许多语言的绑定。

您可以从这里了解git如何存储对象:请阅读该书的"内部和管道"部分中的其他章节,以了解它是如何工作的。

本质上,没有"保存提交历史的文件",它比这更复杂。你应该使用你所选择的语言的一个现有的API(搜索"git API"和你的语言,那里有很多)。

最新更新