如何容忍对工作树的外部更改是libgit2与已加载的存储库对象?

时间:2015-03-12 17:52:47

标签: libgit2

想象一下,你有一个长时间运行的进程,它在程序启动时实例化git_repository*对象。有时会查询提交(git_commit_lookup),检查存储库状态(git_repository_head_unborn),解析和列出引用(git_revparse_singlegit_reference_lookupgit_branch_iterator_new ,...)。

然而,独立于此过程,还有其他进程(例如,vanilla git)正在处理和更改该工作树(例如,提交,拉动,推送,变基,创建分支......)。

  • 我是否必须根据例如过期的缓存数据(例如索引结构或odb文件)或mem映射文件?
  • 我是否不得不担心收到过时的数据?
  • 我不得不担心因为libgit2开始为缓存分配越来越多的内存吗?
  • 或者我是否必须git_repository_free定期获得“新鲜”git_repository*指针?

我使用Visual Studio 2013(Update4),当我在工作树上工作时,它会不时在git2-...dll中崩溃...所以我想知道libgit2是否是针对这种情况设计的。

使用我自己的应用程序进行的首次测试表明不会发生崩溃,但这当然可以取决于我的特定测试......

1 个答案:

答案 0 :(得分:1)

预计libgit2的实例将与其他git客户端(git.git,libgit2,jgit等)很好地配合使用。

  

我是否必须根据例如过时的缓存数据(如索引结构或odb文件)或mem-mapped文件?

你不应该,不。我们将索引读入内存并对其进行操作。如果在下面进行了更改,您可能会看到过时的信息,但您不应该崩溃。如果你这样做,那将是一个错误。

  

我是否必须担心收到过时的数据?

您需要通过实际场景澄清这一点。例如:对于索引,如果使用git_index_load加载它,则会将索引读入内存。然后你可以对它进行操作。如果其他人更新了索引,那么您的数据确实已经过时了。

如果您期望大量并发,您可能希望重新加载内容。例如,如果索引自上次加载后发生了变化,您可以调用git_index_load重新加载索引。

  

我是否必须担心,因为libgit2开始为缓存分配越来越多的内存?

缓存配置为libgit2 option。它的默认值相对适中,但缓存大小有限制。

  

或者我是否需要git_repository_free并定期获取“新鲜的”git_repository *指针?

我不认为这会带来多大好处。