2KB项目,专业的源码交易网站 帮助 收藏 每日签到

运用 Libgit2 完成在数据库中存储 Git 堆栈

  • 时间:2019-04-09 15:32 编辑:2KB 来源:2KB.COM 阅读:656
  • 扫一扫,手机访问
  • 分享
摘要:
libgit2 英文原文:Your Git Repository in a Database: Pluggable Backends in Libgit2

Git有一个知名的定义明白的数据存储构造。在每个Git堆栈的.git目次下,你都可以找到下面几个目次:用于存储数据的objects目次,refs目次,用于分支和标志指针等等。除此以外,Git堆栈中一切的信息都采取立体文件的方法存储,只是有点文件会触及多一点格局

但是,我们发明,在Git堆栈中存储数据其实不只要上述一种方法。实践上,你可使用下面几种方法存储:关系或许非关系型数据库,一个内存中的数据构造,或许相似亚马逊S3的工具。

这可以经过libgit2库供给的灵敏的后端来完成。


这意味着甚么

运用可选择的Git存储处理计划多是最风趣的,关于供给的Git托管办事或产品来讲 – 就像我们在 Deveo 做的一样. 托管办事供给商的用例,包含:

  • 缓存的Git数据疾速的拜访,经过运用一个内存备份或Memcached或Redis的备份与回退,可所以传统的文件存储。

  • 构建一个容错的处理计划, 乃至是一个多点复制的处理计划, 经过在设计用于此目标当代数据库系统中存储数据. 最少 Voldemort, Riak, 或许 Cassandra 都可行.

在此以外,我还盼望当我们拜访GIT时,有一套齐备的可拔插存储的用例。

其它翻译版本 (1) 加载中

Git堆栈的两种数据贮存

固然当我们不深化研讨Git的用户接口,怎样也想不到它的外部构造,可是实践上Git堆栈特殊容易。Git堆栈的中心仅仅由两种首要的构造构成:object数据库和ref数据库,其它都是基于此的。

object数据库

object数据库存储着一切的数据。包含一切文件的内容,目次构造,提交,一切都在object数据库中。但是,值得留意的是object数据库实质上只是一个键值存储。

在object数据库中,Git采取基于散列检索的方法存储数据,这意味着存储中的键是值的散列(SHA1)。

这也带来更一步的风趣的影响:在object数据库中的终??上是稳定的,因而其实不需求更新操作。

剩下的就是一个可以实行四步操作的根本数据构造:

get_keys()
read(key_or_prefix)
add(key,value)
delete(key)

很轻易可以看出,相似上面的构造其实不必定要经过立体文件存储的方法来完成!Git默许的,基于文件的object数据库仅仅是其笼统观点的一种完成方法。

Ref 数据库

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

Libgit2是用纯C写的一个Git完成。它被设计作为Git reference完成的一个替换,其供给了与其他的库和使用顺序的简洁衔接。它实践上是Git绑定到其他很多编程言语的根底。

libgit2的一个不太为人知的特征是它有一个可插拔的后端,这意味着除像Git惯例的将工具数据库和ref数据库存储在立体文件中外,你还可以供给本人的后端完成,而且可以做任何你想做的。让我们看看它是怎么任务的。

libgit2工具数据库后端完成

libgit2工具数据库完成代码是经过C构造git_odb_backend里的函数来拜访数据的, git2/sys/odb_backend.h里定义了这个构造。它的根本功用上面曾经赐与了阐明,为了便于运用,它还具有其他几个功用(比方仅读取工具头,拜访流数据,写文件包等)。
在libgit2里,内置两个这类C构造的完成。这两个完成都支撑传统Git所具有的两种工具存储格局:

  • odb_loose是以松懈文件格局拜访工具数据库的后端完成。它拜访的每一个工具都位于objects目次下的对应的单个文件里,并且每一个文件的名字对应的是文件内容的SHA1后果。

  • odb_pack是以文件包格局拜访工具数据库的后端完成。它拜访的工具位于Git的文件包内,Git文件包是一种文件格局,这类文件格局既节俭了工具存储空间,又便于推送或许拉取工具时工具的传送。

在你创立Git工具数据库的时分,你可使用git_odb_backend构造的恣意一种实例,包含用户自定义。这就答应你拔出本人编写的代码完成,在这篇文章的后一部分我们将会看到怎样做到这些。

libgit2 Ref数据库的后端完成

异样,你也能够运用用户自定义的ref数据库的后端完成,终极就会构成一个完整由通俗的文本文件构成的Git堆栈。libgit2为了到达这个目标而运用的这项技术与其在工具数据库所运用的技术实质上是类似的。这里所运用的构造是git_refdb_backend,定义在git/sys/refdb_backend.h里,并且关于分歧的拜访操作供给了分歧的函数。

libgit2里对ref数据库后端仅供给了一种完成:文件系统后端完成 refdb_fs,它是经过拜访Git堆栈的 refs目次的refs来完成的。

其它工具数据库后端完成

除上面曾经提到的内置后端完成外,由libgit2团队保护的 libgit2-backends堆栈还供给了几个用户自定义的工具数据库后端完成:

这些工具数据库后端不单可使用,并且仍是你编写本人的后端完成的十分好的终点。

设置

让我们来看看怎么实践运用这些替换后端。 

凡是,当我们运用内置的后端时会运用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,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部