使用 Octokit (c#, .net) 从大型 github 企业存储库中高效下载单个文件

Posted

技术标签:

【中文标题】使用 Octokit (c#, .net) 从大型 github 企业存储库中高效下载单个文件【英文标题】:Downloading a single file, from a large github enterprise repo, efficiently, with Octokit (c#, .net) 【发布时间】:2018-08-29 21:28:22 【问题描述】:

我正在尝试使用 OctoKit 从 github 企业下载单个文件,给出 C# 中的 URL。这是 master (或默认分支)的头版本。

我想做相当于:

curl -H 'Authorization: token INSERTACCESSTOKENHERE' -H 'Accept:application/vnd.github.v3.raw' -O -L https://private.github.enterprise.com/repos/owner/repo/contents/path/foo.txt

我找到了一种方法来做到这一点,但是 repo 非常大,需要很长时间。原因是,我必须爬取整个树才能找到我想要的特定文件的标识符。

Uri url = new Uri(URL);
String trans_fullname = String.Format("/0/", repo.FullName);
String basePath = url.AbsolutePath.Replace(trans_fullname, "");

/* this, and the linq line, are what is taking all the time */

var cannotuseawait = client.Git.Tree.GetRecursive(repo.Id, "heads/master" );
cannotuseawait.Wait();
TreeResponse tree = cannotuseawait.Result;

/* searching through a lot of items!!!!! */

TreeItem Found = (from foo in tree.Tree where foo.Path.Contains(basePath) select foo).SingleOrDefault<TreeItem>();
var fwait = client.Git.Blob.Get(Repo.Id, Found.Sha);
fwait.wait();
var contents_64 = fwait.Result;

同样,这需要 4 多分钟,因为我们的存储库非常庞大。虽然,上面的 curl 命令相对即时......所以,我知道有一种方法。我不想放弃 Octokit,因为我在项目中还有其他已经可以使用它的功能。

【问题讨论】:

【参考方案1】:

原来,在 client.Repository.Content 对象中,有一些方法称为 UpdateFile、GetReadMe、DeleteFile、CreateFile,但没有“GetFile”。

但是,与直觉相反(至少对我而言),有一个名为“GetAllContents”的函数,通常,正如人们所期望的那样,它会获取 repo 的所有内容。但是,其中一个重载将路径作为参数,因此您可以将其限制为文件。我将在这里限制表达我的挫败感,只是说这不直观。

        var cannotuseawait = client.Repository.Content.GetAllContents(Repo.Id, basePath);
        cannotuseawait.Wait();
        var res = cannotuseawait.Result;

【讨论】:

以上是关于使用 Octokit (c#, .net) 从大型 github 企业存储库中高效下载单个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 octokit.net 获取 2 个 git 标签之间的提交次数?

使用 Octokit 从组织中检索私有存储库

使用 Octokit 从 Github 列出所有组织

Rails 6 如何使用 Octokit 从 Github 文件获取中处理 404

从存储库中读取代码

如何使用 Octokit 打开 Github Pages 进行 repo?