我正在开发一个使用Git作为数据库的应用程序。我目前的做法是在应用程序中调用 git
shell命令来构建一个新的提交。这是非常简单的,但有一个很大的缺点,就是不允许并发写入数据库:两个线程不能同时构造提交,因为有一个单一的 HEAD
,单 index
和一个工作副本。
然而,由于提交、树和 blobs 都是内容地址,我认为应该可以同时构造所有这些内容。对此,推荐的方法是什么?也许可以这样做。
git add
, git commit
等,其中明确规定了不同的 HEAD
和 index
要使用的文件。据我所知,这种东西是不存在的。git clone
为每一个并发用户获取一个全新的工作副本。这是非常昂贵的。自2014年以来,已经有几个倡议提出了一个 "类似Git "的数据库。
最新的是 liquidata-incdolt: "Git for data"
多尔特 是一个关系型数据库,即它有表,你可以对这些表执行 SQL 查询。
它还拥有在表单元格层面操作的版本控制基元。因此,Dolt是一个支持细粒度的价值导向的版本控制的数据库,所有对数据和模式的更改都存储在提交日志中。
之前,采用了不同的方法。SOM-ResearchGitana (2017).
见"。通过Gitana为Git建立概念和数据库模式。"通过 Valerio Cosentino (推特)
更接近你要找的是 src-dgitbase
git仓库的SQL接口,用G语言编写。
它可以用来执行关于Git历史记录的SQL查询和关于 通用AST 的代码本身。
这三个项目都可以包含关于如何使用Git进行这种数据库使用的想法。
还需要注意的是,最近的Git版本(包括即将到来的2020年第二季度Git 2.27)已经改进了以下内容 git push --atomic
.
同样的Git 2.27正在实现两阶段提交式的原子更新,跨越多个仓库:见"是否有可能连贯地管理多个存储库?".
另一个可能的选择是让每个并发用户创建(和签出)一个新的分支并提交到该分支,然后定期将分支合并到主分支。
但这可能会有一些问题。