我喜欢关于fossil的是它使用普通的sqlite来存储变更集、文件等。我可以使用其命令行工具查询存储库,但如果我需要一些不支持的功能,我可以回退到编写SQL查询。
Mercurial和git更加成熟,它们有更多的库、更多的动力,但它们使用自己的存储库格式。我想知道是否可能将sqlite作为它们的存储库后端。(我知道有工具可以直接查询mercurial或git存储库,但sql似乎更容易些。)
我喜欢关于fossil的是它使用普通的sqlite来存储变更集、文件等。我可以使用其命令行工具查询存储库,但如果我需要一些不支持的功能,我可以回退到编写SQL查询。
Mercurial和git更加成熟,它们有更多的库、更多的动力,但它们使用自己的存储库格式。我想知道是否可能将sqlite作为它们的存储库后端。(我知道有工具可以直接查询mercurial或git存储库,但sql似乎更容易些。)
正如Jefromi所写,Mercurial还使用一种自定义格式来实现高压缩和对任何修订版本的快速访问。这就是revlog格式,它是一种仅追加(append-only)的数据结构,利用了Mercurial中更改集的不可变性。
然而,如果您愿意,当然可以用另一种存储格式替换它。当Google将Mercurial放在Bigtable上时,他们就做到了这一点。这个链接。他们使用自己的后端格式的一个有趣的结果是,在他们的Web界面中看不到任何修订号。在正常的Mercurial中,修订号(本地唯一的整数,您可以使用它代替完整的更改集哈希)是revlog中更改集的索引。当更改集未存储在revlogs中时,就没有自然的索引,因此Google不显示任何修订号。
使用Git,仓库格式是整个工作方式中相当基本的部分。你必须进行大量的工作才能改变它。
我没有阅读过Mercurial的源代码,但我想情况也不会有太大的差别。
正如我在评论中建议的那样,我真的不确定为什么你要这样做。为了使Git仍然具有所有优势,你必须将Git对象存储在SQLite数据库中。你仍然需要所有低级Git工具来访问和操作它们——你不会只是通过它们的SHA1查找blob和tree并自己完成所有其他工作。(即使出于某种原因你想这样做,你也可以轻松地在git对象目录中查找。)
我的建议是,如果你发现有一些在Git中不支持的操作,你应该熟悉一些plumbing命令,并学会如何编写脚本来执行它们。 Git确实暴露了你可能想要的最低层次的操作。
另外,如果你发现想做的特定操作没有得到支持,并且在寻找执行此操作所需的plumbing或必要的脚本时遇到困难,可以在这里发布一个问题!没有理由因为无法使用SQL而陷入困境。
使用libgit2后端是有可能实现的: https://github.com/libgit2/libgit2-backends/blob/master/sqlite/sqlite.c
我没有做过任何测试,但性能应该会受到一点影响。然而,这也更加方便(一个文件包含整个仓库历史记录,传统的SQL查询语言......等等)。
就Git而言,您不能使用官方二进制文件与不同的后端。但是,libgit2项目允许您使用不同的后端存储数据库。但是,您将需要构建所有希望用于提交、合并、推送、拉取、变基等的二进制文件。此外,您将无法使用官方二进制文件修改您的存储库。您必须先将其推送到标准存储库中。