我想从 git 存储提交历史记录的文件中读取,以将每个提交信息存储在我的项目数据库中,并在我的项目视图中显示所有历史记录
2 回答
没有单个文件可以查询以获取提交历史记录。关于 git 的对象模型有很多很好的解释(例如,计算机科学家的 git 、Pro Git、git 社区书籍),但在这里快速解释一下可能会很有用:
git中有各种类型的对象,最重要的是:
- blobs (files) - 只是二进制文件
- 树(目录) - 树是其他对象(通常是 blob 和树)的列表,带有它们的名称、哈希和一组有限的权限
- 提交(版本) - 每个提交包括其父提交的哈希值、作者、提交消息和其他元数据
每一个都由其内容的散列标识,这个散列被称为对象名称——这些是你在使用 git 的过程中可能见过的 40 位十六进制字符串。每个对象都存储在.git/objects/
目录中,或者作为松散对象(每个文件一个)或作为有效存储在包文件中的许多对象之一。该文件.git/HEAD
表示您的存储库当前所在的版本,通常包含对特定分支的引用,由下的文件.git/refs/heads
或存储在包文件中的引用表示。(HEAD
也可以直接指向特定提交的对象名称。)其中一个代表分支的文件,例如.git/refs/heads/master
,只包含一个对象名称。
为了从这个分支提示中遍历历史,git 会在对象数据库中找到该文件中命名的对象,并递归地跟随指向其父对象的指针。
但是,对于您描述的用例(即遍历历史以导出它),我强烈建议您执行以下操作之一:
- 调用 git 命令来查找历史记录。如果你坚持使用所谓的“管道”命令,它们的输出应该在 git 版本之间是稳定的。
- 使用libgit2库来查询存储库。libgit2 是一个用于查询 git 存储库的完全可重入库,它现在具有多种语言的绑定。
您可以在这里了解 git 如何存储对象:git 如何存储对象。阅读该书中“内部和管道”部分中的其他章节,以了解它是如何工作的。
本质上,没有“存储提交历史记录的文件”,它比这更复杂。您应该为您选择的语言使用现有的 API 之一(搜索“git API”和您的语言,那里有很多)。