我检查了BlobFixture.cs
中的代码,发现了一些关于读取文件内容的测试,如下所示。
using (var repo = new Repository(BareTestRepoPath))
{
var blob = repo.Lookup<Blob>("a8233120f6ad708f843d861ce2b7228ec4e3dec6");
var contentStream = blob.GetContentStream();
Assert.Equal(blob.Size, contentStream.Length);
using (var tr = new StreamReader(contentStream, Encoding.UTF8))
{
string content = tr.ReadToEnd();
Assert.Equal("hey there\n", content);
}
}
但我找不到基于文件名获取文件内容的测试。如果可以,怎么做?
最佳答案
每个Tree
包含一个TreeEntry
集合。aTreeEntry
包含一些指向GitObject
的元数据(名称、模式、oid,…)。GitObject
可以通过Target
实例的TreeEntry
属性访问。
大多数情况下,aTreeEntry
将指向aBlob
或另一个Tree
。Tree
类型公开一个索引器,该索引器接受一个路径,以便轻松检索最后指向TreeEntry
的。作为一种方便的方法,Commit
还公开了这样一个索引器。
因此您的代码可以用这种方式表示。
using (var repo = new Repository(BareTestRepoPath))
{
var commit = repo.Lookup<Commit>("deadbeefcafe"); // or any other way to retreive a specific commit
var treeEntry = commit["path/to/my/file.txt");
Debug.Assert(treeEntry.TargetType == TreeEntryTargetType.Blob);
var blob = (Blob)treeEntry.Target;
var contentStream = blob.GetContentStream();
Assert.Equal(blob.Size, contentStream.Length);
using (var tr = new StreamReader(contentStream, Encoding.UTF8))
{
string content = tr.ReadToEnd();
Assert.Equal("hey there\n", content);
}
}