9

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

但是我找不到根据文件名获取文件内容的测试。是否有可能做到这一点,如果可以,怎么做?

4

1 回答 1

23

每个Tree人都有一个集合TreeEntry。ATreeEntry包含一些关于指向的元数据(名称、模式、oid、...)GitObjectGitObject可以通过实例的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);
    }
}
于 2014-02-26T09:33:36.953 回答