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

Ano*_*ous 8 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

nul*_*ken 16

每个Tree都有一个集合TreeEntry.A TreeEntry保存一些关于指向的元数据(名称,模式,oid,...)GitObject.将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 提交不是 diffgram。这是一个快照。因此,它包含生成时工作目录中的所有文件。 (2认同)