Mercurial或Git的关系型数据库后端

14

我喜欢关于fossil的是它使用普通的sqlite来存储变更集、文件等。我可以使用其命令行工具查询存储库,但如果我需要一些不支持的功能,我可以回退到编写SQL查询。

Mercurial和git更加成熟,它们有更多的库、更多的动力,但它们使用自己的存储库格式。我想知道是否可能将sqlite作为它们的存储库后端。(我知道有工具可以直接查询mercurial或git存储库,但sql似乎更容易些。)


2
Git 的目的不就是以高效的方式存储和查询数据吗? - Cascabel
6
Git利用特定领域的知识(其对象是不可变的,并且所有对象都存在于树状结构中)来比一般的关系型数据库更好地存储Git所存储的内容。(无论如何,SQL在表达树形关系方面很糟糕。) - masonk
4个回答

13

正如Jefromi所写,Mercurial还使用一种自定义格式来实现高压缩和对任何修订版本的快速访问。这就是revlog格式,它是一种仅追加(append-only)的数据结构,利用了Mercurial中更改集的不可变性。

然而,如果您愿意,当然可以用另一种存储格式替换它。当Google将Mercurial放在Bigtable上时,他们就做到了这一点。这个链接。他们使用自己的后端格式的一个有趣的结果是,在他们的Web界面中看不到任何修订号。在正常的Mercurial中,修订号(本地唯一的整数,您可以使用它代替完整的更改集哈希)是revlog中更改集的索引。当更改集未存储在revlogs中时,就没有自然的索引,因此Google不显示任何修订号。


12

使用Git,仓库格式是整个工作方式中相当基本的部分。你必须进行大量的工作才能改变它。

我没有阅读过Mercurial的源代码,但我想情况也不会有太大的差别。

正如我在评论中建议的那样,我真的不确定为什么你要这样做。为了使Git仍然具有所有优势,你必须将Git对象存储在SQLite数据库中。你仍然需要所有低级Git工具来访问和操作它们——你不会只是通过它们的SHA1查找blob和tree并自己完成所有其他工作。(即使出于某种原因你想这样做,你也可以轻松地在git对象目录中查找。)

我的建议是,如果你发现有一些在Git中不支持的操作,你应该熟悉一些plumbing命令,并学会如何编写脚本来执行它们。 Git确实暴露了你可能想要的最低层次的操作。

另外,如果你发现想做的特定操作没有得到支持,并且在寻找执行此操作所需的plumbing或必要的脚本时遇到困难,可以在这里发布一个问题!没有理由因为无法使用SQL而陷入困境。


这是 Git 无法高效执行的一件事,因为它使用键值存储:它可以有效地找到提交的所有父级,但它无法找到所有子级,因为所有关系都表示为“父指针”,要做到这一点,它需要使用 O(N) 内存来构建反向图。因此,GitHub 也不允许您查看给定提交的所有子级,我也不知道有哪个广泛使用的 Git 工具可以实现。相比之下,在 Fossil 中查找提交的所有子级非常简单。 - saolof

8

1

就Git而言,您不能使用官方二进制文件与不同的后端。但是,libgit2项目允许您使用不同的后端存储数据库。但是,您将需要构建所有希望用于提交、合并、推送、拉取、变基等的二进制文件。此外,您将无法使用官方二进制文件修改您的存储库。您必须先将其推送到标准存储库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接