mercurial或git的关系数据库后端

时间:2010-08-19 11:50:23

标签: sql database git mercurial fossil

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

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:12)

使用git,存储库格式是一切工作方式的重要组成部分。你需要做很多工作来改变它。

我没有读过任何一个mercurial的来源,但我想情况并没有太大的不同。

正如我在评论中所说,我不确定你为什么要这样做。为了让git仍然能够拥有它的所有优点,你必须在你的sqlite数据库中存储git对象。您仍然需要所有低级git工具来访问和操作它们 - 您不会只是通过SHA1查找blob和树并自己完成所有其他工作。 (即使由于某种原因你想要,你也可以通过查看git对象目录来轻松实现。)

我的建议是,如果你发现你想在git中执行不受支持的操作,你就要熟悉一些管道命令,并弄清楚如何将它们编写为脚本。 Git确实暴露了你想要的最低级别的操作。

P.S。如果您要找到您想要执行的特定不受支持的操作,并且无法找到您需要执行它的管道,或者使用实现它所需的脚本,请在此处发布问题!没有理由因为你不能使用sql而卡住。

答案 2 :(得分:7)

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

我没有做任何测量,但性能会受到一些影响。但是,它也更方便(整个仓库历史的单个文件,经典的SQL查询语言......等等)

答案 3 :(得分:1)

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