mercurial 或 git 的关系数据库后端
Posted
技术标签:
【中文标题】mercurial 或 git 的关系数据库后端【英文标题】:Relational database backend for mercurial or git 【发布时间】:2011-04-01 02:09:53 【问题描述】:我喜欢fossil 的地方在于它使用普通的旧sqlite 来存储变更集、文件等。我可以使用它的命令行工具来查询存储库,但是如果我想要它不支持的东西,我可以回退写一个sql查询。
Mercurial 和 git 更成熟,它们有更多的库,更有动力,但它们使用自己的存储库格式。我想知道是否可以将 sqlite 作为他们的存储库后端。 (我知道有工具可以直接查询 mercurial 或 git repo,但 sql 似乎更容易。)
【问题讨论】:
以一种有效的方式存储和查询其数据不是 git 的重点吗? git 使用特定领域的知识(它的对象是不可变的并且它们都存在于树结构中)在存储 git 存储的东西方面比一般的 RDB 做得更好。 (无论如何,SQL 在表达树关系方面很烂。) 【参考方案1】:使用 git,存储库格式是一切工作方式的一个非常基本的部分。你必须做很多工作才能改变它。
我没有阅读任何 mercurial 的资料,但我想情况并没有太大的不同。
正如我在评论中建议的那样,我不确定您为什么要这样做。为了让 git 仍然能够拥有它的所有优势,您必须将 git 对象存储在您的 sqlite 数据库中。您仍然需要所有低级 git 工具来访问和操作它们——您不会只是通过它们的 SHA1 查找 blob 和树并自己完成所有其余的工作。 (即使出于某种原因你想这样做,你也可以通过查看 git objects 目录来轻松地做到这一点。)
我的建议是,如果你发现你想在 git 中执行不受支持的操作,你应该熟悉一些管道命令并弄清楚如何将它们编写为脚本。 Git 确实公开了您可能想要的最低级别的操作。
附:如果您应该找到您想要执行的特定不受支持的操作,并且无法找到执行该操作所需的管道或执行它所需的脚本,请在此处发布问题!没有理由因为不会使用sql就卡住。
【讨论】:
这是 Git 无法高效完成的一件事,因为它使用了键值存储:它可以有效地找到提交的所有父项,但无法找到所有子项,因为所有关系都表示为“父指针”,要做到这一点,它需要使用 O(N) 内存来构建反向图。结果,github 也不允许您查看给定提交的所有子项,而且我不知道有一个广泛使用的 git 工具可以做到这一点。相比之下,在 Fossil 中找到提交的所有子节点是微不足道的【参考方案2】:正如 Jefromi 所写,Mercurial 还使用自定义格式来实现高压缩和快速访问任何修订版。这是revlog format,它是一个仅附加的数据结构,它利用了 Mercurial 中变更集的不变性。
但是,如果您愿意,当然可以将这种存储格式替换为另一种格式。 Google did this when they put Mercurial on Bigtable 用于 code.google.com。他们使用自己的后端格式的一个有趣结果是,您在他们的 Web 界面中看不到任何修订号。在正常的 Mercurial 中,修订号(您可以使用的仅限本地整数,而不是完整的变更集哈希)是 revlog 中变更集的索引。如果变更集未存储在 revlogs 中,则没有自然索引,因此 Google 不会向您显示修订号。
【讨论】:
【参考方案3】:使用 libgit2 后端是可能的: https://github.com/libgit2/libgit2-backends/blob/master/sqlite/sqlite.c
我没有进行任何测量,但性能应该会受到一点影响。但是,它也更方便(整个回购历史的单个文件,经典的 SQL 查询语言..等)
【讨论】:
【参考方案4】:对于 Git,您不能将不同的后端与官方二进制文件一起使用。但是,libgit2 项目允许您使用不同的后端来存储数据库。但是,您必须构建您希望用于提交、合并、推送、拉取、变基等的所有二进制文件。此外,您将无法使用官方二进制文件修改您的存储库。您必须先将其推送到标准仓库。
【讨论】:
以上是关于mercurial 或 git 的关系数据库后端的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用bazaar,mercurial或git进行部分克隆/分支?
使用hg convert将git repo转换为mercurial时出错
Mercurial(我猜是 Git)和 Dropbox:有啥缺点吗?