如何使用GitHub API将树中的文件标记为已删除?

11
使用GitHub API,我可以创建一个包含所有修改文件的树create a tree,指定一个将被此变更树更新的base_tree,然后提交它。但是,如documentation所述,新树只能包含以下模式的文件路径:100644表示文件(blob),100755表示可执行文件(blob),040000表示子目录(tree),160000表示子模块(commit),或120000表示指定符号链接路径的blob。它没有说明如果我想标记某些路径为已删除会怎么样,例如使用git rm <path>
3个回答

9

2
如果您遇到任何问题,请随时告诉我们 - support@github.com - Ivan Zuzak
谢谢你的回答。我可以执行你所说的那个过程,然后 (tree-commit-ref)。 - fiatjaf
3
如果我只想通过提供 base_tree 来发送差异,而不是发送整个树,该怎么办?是否应该有一种方法来指示文件已被删除? - Marco Jakob
@MarcoJakob 不太明白。能否发送电子邮件至support@github.com并提供有关您使用情况的更多详细信息?分享尽可能多的细节有助于我们提供建议。谢谢。 - Ivan Zuzak
1
据我所知,我们必须发送整个递归树,否则嵌套的目录将被删除。对于简单的需求(更新/删除目录中的文件),这似乎非常笨拙。如果我们只能指示应删除路径(例如将 null 传递给 sha),那么就会变得更加整洁。 - Dominic
显示剩余3条评论

9

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

要删除文件,您可以使用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: '100644',
      type: 'blob',
      sha: null,
    }
  ],
  base_tree: 'sha'
})

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

之后,Ivan说的一切依然正确,因此您应构建一个链接到此新树的新提交,并将引用指向该新提交。


尝试循环遍历树中的所有项,并将“sha:null”设置为需要删除的所有项。但是Github API返回“Unprocessable Entity”。如果我从树中删除这些空值-一切都可以正常工作,但实际上什么也没有发生,我认为,因为我的新树完全匹配旧树(尽管我删除了不必要的项而不是将sha设置为null,但似乎无法从repo中删除这些项)。 - Andrew
更新:该错误的原因是将文件夹标记为“sha:null”。但我尝试了单个文件。没有起作用,尽管我没有收到任何错误提示。该文件仍然存在。 - Andrew
UPD2: 我解决了这个问题。我应该指定base_tree,就像你提到的那样:) 运行得很好。谢谢! - Andrew
请记住,模式应该是100644而不是100664 - Alfredo Gallegos
@AlfredoGallegos 你说得对,但是Git确实允许100664用于rw-rw-r--,但这被证明是一个错误。Git仍然支持100664,因为可能还有一些Git存储库具有这样的条目,但除非你找到一个非常旧的存储库,否则你不会找到任何100664。来源:https://dev59.com/tLHma4cB1Zd3GeqPFQuf - gijswijs

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接