如何使用libgit2Sharp创建内存Blob并实现字符串内容对比?
解决LibGit2Sharp内存仓库创建Blob并对比字符串内容的问题
问题原因
内存仓库的InMemoryObjectDatabase实现中,泛型版本的Write<T>方法存在逻辑缺陷,错误地对Blob对象进行路径合法性检查,导致抛出"path cannot exist in repository"异常,而磁盘仓库的ObjectDatabase实现无此问题。
可行解决方案
使用非泛型的ObjectDatabase.Write()重载方法,直接指定对象类型为ObjectType.Blob,绕开泛型方法的路径检查逻辑:
var oldFileContents = @" Line 1 Line 2 Line 3 "; var newFileContents = @" Line 1 Line 2 has changed "; // 初始化内存仓库 var in_memory_repo = new Repository(); // 使用非泛型Write方法创建Blob对象ID var oldBlobId = in_memory_repo.ObjectDatabase.Write(Encoding.UTF8.GetBytes(oldFileContents), ObjectType.Blob); var newBlobId = in_memory_repo.ObjectDatabase.Write(Encoding.UTF8.GetBytes(newFileContents), ObjectType.Blob); // 通过ID查找Blob实例 var oldBlob = in_memory_repo.Lookup<Blob>(oldBlobId); var newBlob = in_memory_repo.Lookup<Blob>(newBlobId); // 执行对比 var diff = in_memory_repo.Diff.Compare(oldBlob, newBlob);
原理说明
非泛型的Write方法直接接收字节数组和对象类型参数,不会触发内存仓库中针对路径的错误检查逻辑,能正确将字符串内容写入内存仓库的对象数据库并生成Blob实例,后续可正常调用Diff.Compare完成内容对比。
内容的提问来源于stack exchange,提问作者Kasper Marstal
相关产品推荐
相关产品推荐

