How to get file's contents on Git using LibGit2Sharp?

那年仲夏 提交于 2019-12-09 03:11:17

问题


I checked code in BlobFixture.cs and found some tests about reading file's contents like below.

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

But I cannot find a test that getting file's contents based on file's name. Is it possible to do that, if so how?


回答1:


Each Tree holds a collection of TreeEntry. A TreeEntry holds some metadata (name, mode, oid, ...) about a pointed at GitObject. The GitObject can be accessed through the Target property of a TreeEntry instance.

Most of the time, a TreeEntry will point to a Blob or another Tree.

The Tree type exposes an indexer which accepts a path to easily retrieve the finally pointed at TreeEntry. As a convenience method, the Commit exposes such an indexer as well.

Thus your code could be expressed this way.

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


来源:https://stackoverflow.com/questions/22034239/how-to-get-files-contents-on-git-using-libgit2sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!