gpt4 book ai didi

java - 在 Java 中,如何创建一个线程安全的应用程序来重用 Git 存储库?

转载 作者:太空狗 更新时间:2023-10-29 14:43:10 25 4
gpt4 key购买 nike

我有一个开源 Web 应用程序,其中磁盘上的同一个存储库可以由多个线程使用。这涉及对新分支执行 git checkout 并从存储库中访问文件。

这有几个问题:

  • Git 使用存储库中的锁定文件对操作使用悲观并发控制。正如预期的那样,当同一个存储库在其中同时调用多个 git checkout 命令时,这会在 JGit 中引发异常。

  • 在命令完成并移除 Git 的锁定文件后,可以访问存储库中的文件。这意味着另一次检查可能会在此阶段更改文件并导致对文件的解析不正确。

我已将同步方法和信号量视为对此的解决方案,但我不知道在这种情况下的“最佳”解决方案。

最佳答案

我推荐使用 JGit ,Git 的纯 Java 实现。使用普通 Java 库无需在服务器上提供合适的 Git 版本,并且还可以节省一些处理周期,因为它不会为每个 Git 命令生成单独的进程。

在大多数领域,JGit 与 Git CLI 实现不相上下。因此,除非您需要非常具体的 Git 功能,否则您不会看到任何差异。

为了直接访问 blob 的内容,可以使用 ObjectReader/ObjectLoader API。例如:

ObjectReader objectReader = repository.newObjectReader();
ObjectLoader objectLoader = objectReader.open( blobId );
int type = objectLoader.getType(); // Constants.OBJ_BLOB
byte[] contents = objectLoader.getBytes();

有关直接访问 Git 对象数据库的更多信息,请参阅本文:http://www.codeaffine.com/2014/10/20/git-internals/

为了防止并发写访问,JGit 使用与 Git CLI 相同的锁定文件。如果由于锁定失败导致写入访问失败,JGit 将返回相应的命令状态,您允许应用程序代码稍后重试相同的操作。

如果这种“乐观锁定”方法不适合您的用例,您仍然可以求助于工作队列或其他同步方式。

关于java - 在 Java 中,如何创建一个线程安全的应用程序来重用 Git 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45548005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com