我检查了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);
    }
}

08-27 04:50