You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码获取GitHub文件SHA值并解决Octokit CS1061错误

问题原因与修复方案

错误根源

Octokit的GetAllContentsByRef是异步方法,它返回的是Task<IReadOnlyList<RepositoryContent>>类型,而非直接的集合对象。你直接对这个Task调用.First(),自然会触发CS1061错误——Task类并没有First()方法。

修复步骤

  1. 修改方法为异步:将write_new_announcements_to_website方法标记为async,返回值改为async Task(WinForms中事件处理方法也可以用async void,但推荐用async Task)。
  2. 异步获取文件详情:对GetAllContentsByRef调用添加await关键字,拿到实际的文件内容集合。
  3. 正确获取SHA值:对拿到的IReadOnlyList<RepositoryContent>集合调用.First(),再获取其Sha属性(注意Octokit中属性是大写开头的Sha,不是小写的sha)。

修改后的完整代码

private async Task write_new_announcements_to_website(string websiteurl, string newAnnouncements)
{
    GitHubClient gitHubClient = new GitHubClient(new ProductHeaderValue("jerry-spice.github.io"));
    gitHubClient.Credentials = new Credentials("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");
    
    var sb = new StringBuilder("");
    sb.AppendLine(newAnnouncements);
    
    var (owner, repoName, filePath, branch) = ("Jerry-Spice", "jerry-spice.github.io", websiteurl, "main");
    
    // 异步获取文件详情,添加await
    var fileDetails = await gitHubClient.Repository.Content.GetAllContentsByRef(owner, repoName, filePath, branch);
    
    // 注意Octokit中属性是大写的Sha,不是小写sha
    var updateResult = await gitHubClient.Repository.Content.UpdateFile(
        owner, 
        repoName, 
        filePath, 
        new UpdateFileRequest("My updated file", sb.ToString(), fileDetails.First().Sha)
    );
}

额外注意事项

  • 不要硬编码GitHub个人访问令牌(PAT),建议用配置文件或环境变量存储,避免泄露风险。
  • 如果filePath指向的是目录而非单个文件,GetAllContentsByRef会返回该目录下的所有文件/子目录,此时需要额外判断或筛选目标文件。

内容的提问来源于stack exchange,提问作者Jerry Spice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:05:13