【问题标题】:How to connect to a GitHub repo using libgit2?如何使用 libgit2 连接到 GitHub 存储库?
【发布时间】:2013-11-25 05:31:13
【问题描述】:

我正在尝试连接到一个 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);
    }
}

连接正常(例如,如果我更改 URL,我会得到预期的异常),但没有显示 MessageBoxes - 为什么?这应该很简单。

【问题讨论】:

  • 仓库终于克隆了吗?如果你使用调试器调试你的代码呢?
  • @zerkms tmp 文件夹已创建,但仍为空。我实际上只想要 1 个特定文件。
  • 你在那段代码中做了两件完全不相关的事情。检查克隆是否首先工作。如果是这样,请检查您是否真的在加载您想要的存储库。如果您想要的是 GitHub 中的一个文件,您可能应该使用 API,它可以让您完全做到这一点,而不是尝试下载存储库。
  • @CarlosMartínNieto 我最终使用了 raw.github.com - 它更容易。
  • 通常是在您使用专为工作而设计的工具时

标签: c# git github libgit2 libgit2sharp


【解决方案1】:

关于您的问题需要考虑的几点:

  • 无法“连接”到远程存储库并通过 git 协议动态检索一个文件。通常,它需要检索一个本地副本(通过Repository.Clone()),然后针对本地存储库执行一些工作。
  • Mediawiki-core 是一个相当大的存储库。它包含超过 10000 个提交。因此,克隆可能需要相当长的时间。通过为 Clone() 方法提供传输进度处理程序,可以了解有关克隆进度的一些信息。
  • @CarlosMartínNieto 是对的。如果您只需要一个文件(而不是存储库的整个历史记录),那么依靠 GitHub API 确实会更有效。请注意,此 API 的使用受一些您可能需要考虑的 rate limitations 管理,具体取决于预期的使用情况。

下面的代码(很大程度上受您自己的代码启发)克隆了一个远程存储库,将当前的克隆进度输出到控制台,并列举了可从HEAD 访问的提交。

已成功针对 LibGit2Sharp v0.14.1 NuGet 包进行测试。

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;
}

运行时输出如下

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

【讨论】:

  • 很棒的答案,非常感谢您的洞察力!我习惯了 SVN,可以复制单个文件,而不必先克隆整个 repo。
猜你喜欢
  • 2014-02-03
  • 2017-12-08
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多