想象一下,你有一个长时间运行的进程,它在程序启动时实例化git_repository*
对象。有时会查询提交(git_commit_lookup
),检查存储库状态(git_repository_head_unborn
),解析和列出引用(git_revparse_single
,git_reference_lookup
,git_branch_iterator_new
,...)。
然而,独立于此过程,还有其他进程(例如,vanilla git)正在处理和更改该工作树(例如,提交,拉动,推送,变基,创建分支......)。
git_repository_free
定期获得“新鲜”git_repository*
指针?我使用Visual Studio 2013(Update4),当我在工作树上工作时,它会不时在git2-...dll
中崩溃...所以我想知道libgit2是否是针对这种情况设计的。
使用我自己的应用程序进行的首次测试表明不会发生崩溃,但这当然可以取决于我的特定测试......
答案 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 *指针?
我不认为这会带来多大好处。