How to connect to a GitHub repo using libgit2?

2019-07-23 16:32发布

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.

1条回答
狗以群分
2楼-- · 2019-07-23 17:30

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
查看更多
登录 后发表回答