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

.net, c#, git, libgit2sharp, version-control

Solution

Each `Tree` holds a collection of `TreeEntry`s. A `TreeEntry` holds some metadata (name, mode, oid, ...) about a referenced `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 retrieve 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);
    }
}

Problem

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?

Original source

Related problems