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?