我正在尝试使用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
我已经找到了一种方法来做到这一点,但是存储库非常大,需要很长时间。原因是,我必须爬取整个树才能找到我想要的特定文件的标识符。
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,因为我在项目中还有其他功能已经可以使用它。
所以,事实证明,在客户端中。Repository.Content 对象有一些方法称为 UpdateFile、GetReadMe、DeleteFile、CreateFile,但没有"GetFile"。
但是,与直觉相反(至少对我来说(,有一个名为"GetAllContent"的函数,正如人们所期望的那样,它通常会获取存储库的所有内容。但是,其中一个重载采用路径作为参数,因此您可以将其限制为文件。我将在这里限制表达我的沮丧,只是说这并不直观。
var cannotuseawait = client.Repository.Content.GetAllContents(Repo.Id, basePath);
cannotuseawait.Wait();
var res = cannotuseawait.Result;