How to connect to a GitHub repo using libgit2?

I’m trying to connect to a repo:

using(var Git = new Repository(
    Repository.Clone("https://github.com/wikimedia/mediawiki-core", "tmp")
)){
    foreach(var Commit in Git.Commits)
    {
        MessageBox.Show(Commit.Author.Name);
    }
}

It connects ok (as in, if I change the URL I get the expected exception), but no MessageBoxes are shown – why? This should be simple.

  • GIT: Modifying files and commit with same date/time
  • Dataset Designer.cs generate Designer1.cs after taking update from SVN in VS2013
  • Is there a Subversion API that can be used to program against in .NET
  • How should I collaborate with developers who use Xcode?
  • Why are some functions declared extern and header file not included in source in Git source code?
  • Create Template of Git Subtree Repository for simple reuse
  • Setup git repository on a server with ssh access
  • How to add a file to the index in a git pre-commit hook
  • How to add the Signed-off-by field in the git patch
  • Git hooks management
  • Squash all commits in branch in git
  • Can I override working copy by index content?
  • One Solution collect form web for “How to connect to a GitHub repo using libgit2?”

    Few things to consider regarding your question:

    • One cannot “connect” to a remote repository and dynamically retrieve one file through the git protocols. Usually, it is expected to retrieve a local copy (through Repository.Clone()) then to perform some work against the local repository.
    • Mediawiki-core is quite a huge repository. It contains more than 10000 commits. As such, it can take quite some time to be cloned. One can get some insight regarding the progress of the cloning by providing the Clone() method with a transfer progress handler.
    • @CarlosMartínNieto is right. If all you need is one single file (rather than the whole history of the repository), relying on the GitHub API would indeed be more efficient. Note that usage of this API is however governed through some rate limitations you may want to consider, depending on the foreseen usage.

    The code below (greatly inspired from your own code) clones a remote repository, outputting the current clone progress to the console, and enumerates the commits reachable from HEAD.

    It’s been successfully tested against LibGit2Sharp v0.14.1 NuGet package.

    public void CloneAndEnumerateCommitsFromHead()
    {
        var tmp = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
    
        string path = Repository.Clone(
            "https://github.com/nulltoken/TestGitRepository", 
            tmp,
            onTransferProgress: ProgressHandler);
    
        using (var Git = new Repository(path))
        {
            foreach (var Commit in Git.Commits)
            {
                Console.WriteLine("{0} by {1}",
                    Commit.Id.ToString(7),
                    Commit.Author.Name);
            }
        }
    }
    
    private int ProgressHandler(TransferProgress progress)
    {
        Console.WriteLine("{0}/{1}", progress.IndexedObjects, progress.TotalObjects);
        return 0;
    }
    

    When being run, it outputs the following

    0/70
    1/70
    2/70
    2/70
    ...snipped for brevity...
    68/70
    69/70
    70/70
    70/70
    49322bb by A U Thor
    d0114ab by A U Thor
    f73b956 by A U Thor
    6e14752 by A U Thor
    1203b03 by A U Thor
    bab66b4 by A U Thor
    83834a7 by A U Thor
    6462e7d by A U Thor
    42e4e7c by A U Thor
    7f82283 by A U Thor
    59706a1 by A U Thor
    c070ad8 by A U Thor
    d31f5a6 by A U Thor
    83d2f04 by A U Thor
    6db9c2e by A U Thor
    d86a2aa by A U Thor
    0966a43 by A U Thor
    2c34933 by A U Thor
    ac7e7e4 by A U Thor
    58be465 by A U Thor
    6c8b137 by A U Thor
    
    Git Baby is a git and github fan, let's start git clone.