并行的git checkoutaddcommit

问题描述 投票:1回答:2

我正在开发一个使用Git作为数据库的应用程序。我目前的做法是在应用程序中调用 git shell命令来构建一个新的提交。这是非常简单的,但有一个很大的缺点,就是不允许并发写入数据库:两个线程不能同时构造提交,因为有一个单一的 HEAD,单 index和一个工作副本。

然而,由于提交、树和 blobs 都是内容地址,我认为应该可以同时构造所有这些内容。对此,推荐的方法是什么?也许可以这样做。

  • 命令行标志 git add, git commit等,其中明确规定了不同的 HEADindex 要使用的文件。据我所知,这种东西是不存在的。
  • 使用git plumbing命令进行所有操作。不过,我不是这方面的专家,也不完全确定哪些命令是线程安全的。
  • 一个Git服务,可以像传统的数据库连接一样,提供对Git仓库的事务性、并发性访问。据我所知,这样的服务并不存在。我曾考虑过写一个。
  • 放弃,做一个 git clone 为每一个并发用户获取一个全新的工作副本。这是非常昂贵的。
git concurrency git-commit git-checkout git-add
2个回答
2
投票

自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正在实现两阶段提交式的原子更新,跨越多个仓库:见"是否有可能连贯地管理多个存储库?".


0
投票

另一个可能的选择是让每个并发用户创建(和签出)一个新的分支并提交到该分支,然后定期将分支合并到主分支。

但这可能会有一些问题。

  1. 合并可能会失败,需要交互式干预来解决冲突。
  2. 在定期合并之前,用户Y不会看到用户X提交的更改。
© www.soinside.com 2019 - 2024. All rights reserved.