【问题标题】:How do I mark a file as deleted in a tree using the GitHub API?如何使用 GitHub API 在树中将文件标记为已删除?
【发布时间】:2014-05-13 17:30:49
【问题描述】:

使用 GitHub API,我可以 create a tree 包含提交的所有修改文件,指定将使用此更改树更新的 base_tree 然后提交。

但是,正如documentation 所说,新树只能包含具有模式的文件的路径

100644 用于文件 (blob),100755 用于可执行文件 (blob),040000 用于 子目录(树),160000 用于子模块(提交),或120000 用于 一个指定符号链接路径的 blob。

它没有说明如果我想将某个路径标记为已删除,我应该怎么做,就像 git rm <path> 一样。

【问题讨论】:

    标签: github github-api


    【解决方案1】:

    目前,从树(blob 或另一棵树)中删除条目的唯一方法是 construct a new tree 并且不列出该条目。在你拥有那棵树之后,construct a new commit 链接到这棵新树,别忘了bump the ref 指向这个新提交。

    【讨论】:

    • 如果您遇到任何问题,请随时告诉我们--support@github.com。
    • 感谢您的回答。我可以做你说的那个程序,然后(tree-commit-ref)。
    • 很惊讶我是这里的第一个支持者。感谢您的回复。这个问题真的应该在 API 页面上解决!
    • @IvanZuzak 如果我只想通过提供base_tree 而不是发送整个树来发送差异怎么办?难道不应该有办法表明文件已被删除吗?
    • 据我所知,我们必须发送整个递归树,否则嵌套目录将被删除。对于简单的需求(更新/删除目录中的文件),这似乎很笨拙。如果我们可以指示应该删除路径(例如将 null 传递给 sha)会更整洁
    【解决方案2】:

    @ivan-zuzak 的答案已经过时,因为 GitHub API 支持通过传递 null sha 来删除文件。

    要删除文件,您可以使用 octokit 在 Javascript 中创建一棵树,如下所示:

    await octokit.request('POST /repos/{owner}/{repo}/git/trees', {
      owner: 'octocat',
      repo: 'hello-world',
      tree: [
        {
          path: 'path/to/file-that-will-be-deleted.py',
          mode: '100664',
          type: 'blob',
          sha: null,
        }
      ],
      base_tree: 'sha'
    })
    

    base_tree 应包含您要从中删除文件的现有 Git 树对象的 SHA1。

    在那之后,Ivan 所说的一切仍然成立,所以你应该构造一个链接到这个新树的新提交,并碰撞 ref 以指向这个新提交。

    【讨论】:

      【解决方案3】:

      我发现的最干净的方法是 create a new branchcreatedeleteupdate 使用其中的文件contents API,然后是create a merge commit with the master branch,最后是update the master branch to this last commit(最后你也应该delete the temporary side-branch)。

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 2019-02-14
        • 2010-09-30
        • 1970-01-01
        • 2013-03-31
        • 2023-04-01
        • 1970-01-01
        • 2020-04-24
        相关资源
        最近更新 更多