如何使用LibGit2Sharp在Git上获取文件内容?

时间:2014-02-26 07:08:45

标签: c# .net git version-control libgit2sharp

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

但我找不到根据文件名获取文件内容的测试。是否可以这样做,如果是这样的话?

1 个答案:

答案 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);
    }
}