Git有一个知名的定义明白的数据存储构造。在每个Git堆栈的.git目次下,你都可以找到下面几个目次:用于存储数据的objects目次,refs目次,用于分支和标志指针等等。除此以外,Git堆栈中一切的信息都采取立体文件的方法存储,只是有点文件会触及多一点格局。
但是,我们发明,在Git堆栈中存储数据其实不只要上述一种方法。实践上,你可使用下面几种方法存储:关系或许非关系型数据库,一个内存中的数据构造,或许相似亚马逊S3的工具。
这可以经过libgit2库供给的灵敏的后端来完成。
运用可选择的Git存储处理计划多是最风趣的,关于供给的Git托管办事或产品来讲 – 就像我们在 Deveo 做的一样. 托管办事供给商的用例,包含:
缓存的Git数据疾速的拜访,经过运用一个内存备份或Memcached或Redis的备份与回退,可所以传统的文件存储。
构建一个容错的处理计划, 乃至是一个多点复制的处理计划, 经过在设计用于此目标当代数据库系统中存储数据. 最少 Voldemort, Riak, 或许 Cassandra 都可行.
在此以外,我还盼望当我们拜访GIT时,有一套齐备的可拔插存储的用例。
其它翻译版本 (1) 加载中固然当我们不深化研讨Git的用户接口,怎样也想不到它的外部构造,可是实践上Git堆栈特殊容易。Git堆栈的中心仅仅由两种首要的构造构成:object数据库和ref数据库,其它都是基于此的。
object数据库存储着一切的数据。包含一切文件的内容,目次构造,提交,一切都在object数据库中。但是,值得留意的是object数据库实质上只是一个键值存储。
在object数据库中,Git采取基于散列检索的方法存储数据,这意味着存储中的键是值的散列(SHA1)。
这也带来更一步的风趣的影响:在object数据库中的终??上是稳定的,因而其实不需求更新操作。
剩下的就是一个可以实行四步操作的根本数据构造:
get_keys() read(key_or_prefix) add(key,value) delete(key)
很轻易可以看出,相似上面的构造其实不必定要经过立体文件存储的方法来完成!Git默许的,基于文件的object数据库仅仅是其笼统观点的一种完成方法。
ref 数据库贮存了一个Git库的references - branches、tags和HEAD.
就像工具数据库,ref数据库根本上也是一个键值存储。键援用的参考标识符,值是SHA1哈希值,它们按提交工具的次第存在于工具数据库中。
ref数据库的值是可变的,这是和工具数据库比拟时的一个首要差别。master唆使的提交点跟着工夫改动而改动。这意味在详细操作时ref数据库需供给一些差别:
get_keys() read(key) write(key, value) rename(old_key, new_key) delete(key)
Libgit2是用纯C写的一个Git完成。它被设计作为Git reference完成的一个替换,其供给了与其他的库和使用顺序的简洁衔接。它实践上是Git绑定到其他很多编程言语的根底。
libgit2的一个不太为人知的特征是它有一个可插拔的后端,这意味着除像Git惯例的将工具数据库和ref数据库存储在立体文件中外,你还可以供给本人的后端完成,而且可以做任何你想做的。让我们看看它是怎么任务的。
libgit2工具数据库完成代码是经过C构造git_odb_backend里的函数来拜访数据的, git2/sys/odb_backend.h里定义了这个构造。它的根本功用上面曾经赐与了阐明,为了便于运用,它还具有其他几个功用(比方仅读取工具头,拜访流数据,写文件包等)。
在libgit2里,内置两个这类C构造的完成。这两个完成都支撑传统Git所具有的两种工具存储格局:
odb_loose是以松懈文件格局拜访工具数据库的后端完成。它拜访的每一个工具都位于objects目次下的对应的单个文件里,并且每一个文件的名字对应的是文件内容的SHA1后果。
在你创立Git工具数据库的时分,你可使用git_odb_backend构造的恣意一种实例,包含用户自定义。这就答应你拔出本人编写的代码完成,在这篇文章的后一部分我们将会看到怎样做到这些。
异样,你也能够运用用户自定义的ref数据库的后端完成,终极就会构成一个完整由通俗的文本文件构成的Git堆栈。libgit2为了到达这个目标而运用的这项技术与其在工具数据库所运用的技术实质上是类似的。这里所运用的构造是git_refdb_backend
,定义在git/sys/refdb_backend.h里,并且关于分歧的拜访操作供给了分歧的函数。
libgit2里对ref数据库后端仅供给了一种完成:文件系统后端完成 refdb_fs,它是经过拜访Git堆栈的 refs
目次的refs来完成的。
除上面曾经提到的内置后端完成外,由libgit2团队保护的 libgit2-backends堆栈还供给了几个用户自定义的工具数据库后端完成:
memecached后端完成,它把工具保管在Memcached实例里。
mysql后端完成,它把工具存储在Mysql数据库里
redis后端完成,它把工具存储在Redis数据库里
sqlite后端完成,它把工具存储在SQLite数据库里
这些工具数据库后端不单可使用,并且仍是你编写本人的后端完成的十分好的终点。
让我们来看看怎么实践运用这些替换后端。
凡是,当我们运用内置的后端时会运用usual.gitdirectory中包括的文件系统途径挪用git_repository_open,比方松懈工具数据库、packfiles和ref途径。
当运用自定义的后端时我们需求做的是挪用git_repository_wrap_odb并供给我们本人的数据库工具和一个自定义的后端。
比如说,我们有一个为Voldemort数据库编写的自定义后端,运用下面的结构函数:
int git_odb_backend_voldemort(git_odb_backend **backend_out, git_repository *repo, const char *repo_id, const char *bootstrap_url, const char *store_name); int git_refdb_backend_voldemort(git_refdb_backend **backend_out, git_repository *repo, git_refdb *refdb, const char *bootstrap_url, const char *store_name);
下面是我们运用这些后端创立一个Git堆栈的办法:
git_repository *repo; git_odb *odb; git_odb_backend *voldemort_odb_backend; git_refdb *refdb; git_refdb_backend *voldemort_refdb_backend; int error = 0; error = git_odb_new(&odb); if (!error) error = git_repository_wrap_odb(&repo, odb); if (!error) error = git_odb_backend_voldemort(&voldemort_odb_backend, repo, "my_repo", "tcp://localhost:6666", "git_odb"); if (!error) error = git_odb_add_backend(odb, voldemort_odb_backend, 1); if (!error) error = git_refdb_new(&refdb, repo); if (!error) error = git_refdb_backend_voldemort(&voldemort_refdb_backend, refdb, "my_repo", "tcp://localhost:6666", "git_refdb"); if (!error) error = git_refdb_set_backend(refdb, voldemort_refdb_backend); if (!error) git_repository_set_refdb(repo, refdb);
第8行我们结构了一个不触及任何后真个工具数据库。
第10行我们结构了一个基于这个数据库的一个Git堆栈。
第12行我们结构了Voldemort工具数据库后端。
第14行我们将voldemort工具数据库后端挂到工具数据库。工具书库支撑多后端,次序看起来基于一个属性数字。我们设定Voldemort后真个属性为1.
第16行我们结构了一个不触及任何后真个ref数据库。
第18行我们结构了Voldemort ref数据库后端,就像我们创立工具数据库那样。
第20行我们将Voldemort ref数据库后端挂到ref数据库。
第22行我们终极将ref数据库挂到堆栈上,如许我们有了一个可读写的可正常运转的堆栈。
在交换Voldemort后端时,你天然可使用一个本人的完成,或运用libgit2-backends中的一个已存在完成。你乃至可以经过在添加多种自定义工具数据库时运用多种分歧的优先级来供给多种后端。举例来讲,如许在施行高速缓存时长短常便捷的。
假如你不运用原始的C,你可以看看一切libgit2绑定的言语来确认下用你的编程言语怎么完成。举例来讲,我曾经运用了Rugged用Ruby绑定了一下,如许我可以在Ruby代码中自定义拔出一个后端。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务