如何使用 GitHub API 和 Octokit JavaScript 将大于 1mb 的文件提交到 GitHub

How to commit files larger than 1mb to GitHub using the GitHub API and Octokit JavaScript

我需要在客户端浏览器应用程序中从 JavaScript 运行 更新 GitHub 上的文件。该文件可能大于 1mb,因此我无法使用 octokit createFile() 函数,该函数仅限于小于 1mb 的文件。

我有一个通过 oauth 的经过身份验证的用户、一个文件和一个文件最终需要进入的存储库。基本上我有:

this.octokit = new Octokit();
this.octokit.authenticate({
    type: "oauth",
    token: github.access_token
})
this.file = "some text in a string thing";
this.octokit.repos.getContents({
    owner: this.currentUser,
    repo: this.currentRepoName,
    path: path
}).then(thisRepo => {

我需要弄清楚如何将 this.file 的内容放入该存储库根文件夹中的文件中,比如 project.stl。

我发现这个非常棒 blog post,其中描述了使用 ruby 版本的 octokit 库的过程如何工作。我对 ruby 没有任何经验,所以了解那里发生的事情需要我一些时间。这似乎是一个足够普遍的问题,应该有一个 JavaScript 解决方案的例子。我希望任何人都可以提供有关将文件从 JavaScript 上传到 GitHub 的任何帮助,如果我可以开始工作作为示例,我将 post 我的解决方案。

编辑:我重写了它的工作原理,我认为这样更好:

async createCommit (octokit, { owner, repo, base, changes }) { 让回应;

  if (!base) {
    response = await octokit.repos.get({ owner, repo })
    base = response.data.default_branch
  }

  response = await octokit.repos.listCommits({
    owner,
    repo,
    sha: base,
    per_page: 1
  })
  let latestCommitSha = response.data[0].sha
  const treeSha = response.data[0].commit.tree.sha

  response = await octokit.git.createTree({
    owner,
    repo,
    base_tree: treeSha,
    tree: Object.keys(changes.files).map(path => {
      return {
        path,
        mode: '100644',
        content: changes.files[path]
      }
    })
  })
  const newTreeSha = response.data.sha

  response = await octokit.git.createCommit({
    owner,
    repo,
    message: changes.commit,
    tree: newTreeSha,
    parents: [latestCommitSha]
  })
  latestCommitSha = response.data.sha

  await octokit.git.updateRef({
    owner,
    repo,
    sha: latestCommitSha,
    ref: `heads/master`,
    force: true
  })

  console.log("Project saved");

}