关于 git 本身,第一次提到“备用对象数据库位置”是在 commit ace1534(2005 年 5 月,git v0.99)
引入 SHA1_FILE_DIRECTORIES 以支持多个对象数据库。
SHA1_FILE_DIRECTORIES 环境变量是冒号分隔的路径
用于查找在通常位置找不到的 SHA1 文件
阅读。创建新的 SHA1 文件不使用此替代对象
数据库定位机制。这对于归档较旧的、很少使用的文件很有用
使用的对象到单独的目录中。
这是第一个示例,很快从 git 中删除(2005 年 9 月,commit a9ab586)
备用对象数据库struct 在commit 9a217f2(2005 年 6 月,v0.99)中正式引入cache.h#L236-L239。
今天 (most recent cache.h),struct 仍然存在,但这次使用 链接机制,于 2005 年 8 月推出,v0.99.5,commit d5a63b9。
extern struct alternate_object_database {
struct alternate_object_database *next;
char *name;
char base[FLEX_ARRAY]; /* more */
} *alt_odb_list;
准备备用对象数据库注册表。
变量alt_odb_list指向struct alternate_object_database列表。
此列表中的元素来自冒号分隔的ALTERNATE_DB_ENVIRONMENT 环境变量和GIT_OBJECT_DIRECTORY/info/alternates 中的非空元素,其内容与该环境变量的格式完全相同。
它的基点指向包含“/the/directory/corresponding/to/.git/objects/...”的静态分配缓冲区,而在上例中,它的名称指向“.git/objects/”末尾的斜线之后,并且有足够的空间容纳 40 字节十六进制 SHA1,第一级间接的额外斜线和终止 NUL。
这可能是你可以在 git 源代码中找到的“替代机制”最接近的定义。
您可以看到alternate database implementation in libgit2 的示例(Libgit2 是用纯 C 编写的 Git 实现)
Git 存储库的核心只有两个主要结构,一切都基于它:object database 和 ref database。
对象数据库是存储所有数据的地方。所有文件的内容、目录结构、提交、所有内容都进入对象数据库。然而,对象数据库的非凡之处在于它本质上只是一个键值存储。
Git 使用基于哈希的检索将数据存储在对象数据库中,这意味着存储的键是值的 (SHA1) 哈希。
这有一些有趣的进一步含义:对象数据库中的值本质上是不可变的,您不需要更新操作。
您可以提供自己的后端实现并做任何您想做的事情,而不是以 Git 通常的方式存储对象数据库和引用数据库(在平面文件中)。
Git 传统上支持:
-
odb_loose 实现了松散文件格式后端。它访问对象目录中单独文件中的每个对象,每个文件的名称对应于其内容的 SHA1 哈希值。
-
odb_pack 实现了 packfile 后端。它访问 Git packfiles 中的对象,这是一种文件格式,用于节省空间的对象存储,以及在推送或拉取时传输对象。
(另见“Is the git binary diff algorithm (delta storage) standardized?”)