我检查了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);
}
}
但我找不到根据文件名获取文件内容的测试。是否可以这样做,如果是这样的话?
答案 0 :(得分:15)
每个Tree
都包含TreeEntry
的集合。 TreeEntry
包含一些指向GitObject
的元数据(名称,模式,oid,...)。可以通过GitObject
实例的Target
属性访问TreeEntry
。
大多数情况下,TreeEntry
会指向Blob
或其他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);
}
}