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

时间:2018-03-20 22:01:31

标签: git github github-enterprise octokit octokit.net

我正在尝试从github enterprise下载单个文件,在C#中使用OctoKit提供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,因为我已经在项目中使用了其他功能。

1 个答案:

答案 0 :(得分:0)

事实证明,在client.Repository.Content对象中有一些方法称为UpdateFile,GetReadMe,DeleteFile,CreateFile,但没有“GetFile”。

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

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