代码之家  ›  专栏  ›  技术社区  ›  Adam Schmideg

Mercurial或Git的关系数据库后端

  •  13
  • Adam Schmideg  · 技术社区  · 14 年前

    我喜欢什么 fossil 它使用普通的老sqlite来存储变更集、文件等。我可以使用它的命令行工具来查询存储库,但是如果我想要它不支持的东西,我可以回退到编写SQL查询。

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

    4 回复  |  直到 6 年前
        1
  •  12
  •   Cascabel    14 年前

    对于Git,存储库格式是所有工作方式的基本组成部分。你得做很多工作才能改变这一点。

    我没有读过任何Mercurial的资料,但我想情况并没有什么不同。

    正如我在评论中建议的那样,我不太确定你为什么要这样做。为了让Git仍然能够拥有所有的优势,您必须将Git对象存储在您的sqlite数据库中。你仍然需要所有的低级的Git工具来访问和操作它们——你不会仅仅通过它们的sha1来查找blob和trees,然后自己完成其余的工作。(即使出于某种原因,您也可以通过在git对象目录中查找来轻松地完成这项工作。)

    我的建议是,如果您发现您希望在Git中执行的某些操作不受支持,您可以熟悉一些管道命令,并了解如何将它们编写为脚本。Git确实公开了您可能需要的几乎最低级别的操作。

    另外,如果你发现你想要做的一个特定的不支持的操作,并且找不到你需要执行的管道,或者使用实现它所必需的脚本,请在这里发布一个问题!没有理由仅仅因为不能使用SQL就陷入困境。

        2
  •  13
  •   Vadim Kotov First Zero    6 年前

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

    但是,如果您愿意,当然可以用另一种存储格式替换此存储格式。 Google did this when they put Mercurial on Bigtable 对于code.google.com。他们使用自己的后端格式的一个有趣的结果是,在他们的Web界面中看不到任何修订号。在普通的mercurial中,修订号(只能使用本地整数而不是完整的变更集哈希)是revlog中变更集的索引。如果变更集没有存储在revlogs中,那么就没有自然索引,因此google不会向您显示修订号。

        3
  •  7
  •   maattdd    8 年前

    使用libgit2后端是可能的: https://github.com/libgit2/libgit2-backends/blob/master/sqlite/sqlite.c

    我没有做过任何测量,但是性能会有点问题。但是,它也更方便(整个repo历史的单个文件、经典的SQL查询语言等)。

        4
  •  1
  •   T0xicCode    11 年前

    对于git,您不能在官方二进制文件中使用不同的后端。但是,libgit2项目允许您使用不同的后端来存储数据库。但是,您必须构建所有要用于提交、合并、推送、拉取、重新平衡等的二进制文件。而且,您将无法使用正式的二进制文件修改存储库。你必须先把它推到标准回购。