Search code examples
c#gitf#libgit2libgit2sharp

Download one file from remote (git show) using libgit2sharp


Using git show, I can fetch the contents of a particular file from a particular commit, without changing the state of my local clone:

$ git show <file>
$ git show <commit>:<file>

How can I achieve this programatically using ?


Solution

  • According to the documentation:

    $ git show 807736c691865a8f03c6f433d90db16d2ac7a005:a.txt

    Is equivalent to the code below:

    using System;
    using System.IO;
    using System.Linq;
    using System.Text;
    using LibGit2Sharp;
    
    namespace ConsoleApp2
    {
        class Program
        {
            static void Main(string[] args)
            {
                var pathToFile = "a.txt";
                var commitSha = "807736c691865a8f03c6f433d90db16d2ac7a005";
                var repoPath = @"path/to/repo";
    
                using (var repo =
                    new Repository(repoPath))
                {
                    var commit = repo.Commits.Single(c => c.Sha == commitSha);
                    var file =  commit[pathToFile];
    
                    var blob = file.Target as Blob;
                    using (var content = new StreamReader(blob.GetContentStream(), Encoding.UTF8))
                    {
                        var fileContent = content.ReadToEnd();
                        Console.WriteLine(fileContent);
                    }
                }
            }
        }
    }