带有加载的存储库对象的 libgit2 对工作树的外部更改有多宽容?

How tolerant against external changes to a working tree is libgit2 with a loaded repository object?

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

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

我使用 Visual Studio 2013 (Update4),当我在工作树上工作时,它会不时地在 git2-...dll 中崩溃...所以我想知道 libgit2一般是为这种场景设计的。

我自己的应用程序的第一次测试表明没有发生崩溃,但这当然取决于我的具体测试...

预计 libgit2 的实例将与其他 git 客户端(git.git、libgit2、jgit等)。

Do I have to expect crashes based on e.g. outdated cached data (such as index structures or odb files) or mem-mapped files?

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

Do I have to worry that I receive outdated data?

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

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

Do I have to worry because libgit2 starts allocating more and more memory for caching?

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

Or do I have to git_repository_free and get a "fresh" git_repository* pointer regularly?

我不认为这会有什么好处。