我喜欢fossil的地方是它使用普通的旧sqlite来存储变更集、文件等。我可以使用它的命令行工具来查询存储库,但是如果我想要它不支持的东西,我可以回退到编写sql查询.
Mercurial 和 git 更成熟,他们有更多的库,更有动力,但他们使用自己的存储库格式。我想知道是否可以将 sqlite 作为他们的存储库后端。(我知道有工具可以直接查询 mercurial 或 git repo,但 sql 似乎更容易。)
正如 Jefromi 所写,Mercurial 还使用自定义格式来实现高压缩和快速访问任何修订版。这是revlog 格式,它是一种仅附加的数据结构,它利用了 Mercurial 中变更集的不变性。
但是,如果您愿意,当然可以将这种存储格式替换为另一种格式。谷歌在将 Mercurial 放在code.google.com 的 Bigtable 上时就是这样做的。他们使用自己的后端格式的一个有趣后果是,您在他们的 Web 界面中看不到任何修订号。在正常的 Mercurial 中,修订号(您可以使用的仅限本地整数,而不是完整的变更集哈希)是 revlog 中变更集的索引。当变更集未存储在 revlogs 中时,没有自然索引,因此 Google 不会向您显示修订号。
使用 git,存储库格式是一切工作方式的一个非常基本的部分。你必须做很多工作才能改变它。
我没有阅读任何 mercurial 的资料,但我想情况并没有太大的不同。
正如我在评论中所建议的那样,我不确定您为什么要这样做。为了让 git 仍然能够拥有它的所有优势,您必须将 git 对象存储在您的 sqlite 数据库中。您仍然需要所有低级 git 工具来访问和操作它们——您不会只是通过它们的 SHA1 查找 blob 和树并自己完成所有其余的工作。(即使出于某种原因你想这样做,你也可以通过查看 git objects 目录来轻松地做到这一点。)
我的建议是,如果您发现要在 git 中执行的某些操作不受支持,请熟悉一些管道命令并弄清楚如何将它们编写为脚本。Git 确实暴露了你可能想要的最低级别的操作。
PS 如果您发现您想要执行的特定不受支持的操作,并且无法找到执行该操作所需的管道或执行该操作所需的脚本,请在此处发布问题!没有理由仅仅因为你不能使用 sql 而被卡住。
使用 libgit2 后端是可能的: https ://github.com/libgit2/libgit2-backends/blob/master/sqlite/sqlite.c
我没有进行任何测量,但性能应该会受到一点影响。但是,它也更方便(整个回购历史的单个文件,经典的 SQL 查询语言..等..)
对于 Git,您不能将不同的后端与官方二进制文件一起使用。但是,libgit2 项目允许您使用不同的后端来存储数据库。但是,您必须构建您希望用于提交、合并、推送、拉取、变基等的所有二进制文件。此外,您将无法使用官方二进制文件修改您的存储库。您必须先将其推送到标准仓库。