14

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

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

4

4 回答 4

13

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

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

于 2010-08-21T19:51:50.470 回答
12

使用 git,存储库格式是一切工作方式的一个非常基本的部分。你必须做很多工作才能改变它。

我没有阅读任何 mercurial 的资料,但我想情况并没有太大的不同。

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

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

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

于 2010-08-19T13:07:24.380 回答
8

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

我没有进行任何测量,但性能应该会受到一点影响。但是,它也更方便(整个回购历史的单个文件,经典的 SQL 查询语言..等..)

于 2013-06-20T18:33:10.570 回答
1

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

于 2013-10-16T15:09:53.660 回答