GitHub v3 API - 我如何在仓库中创建初始提交?

11

我正在使用v3 API,已成功列举了仓库/树/分支,访问了文件内容,并创建了blobs/trees/commits。现在我尝试创建一个新的 repo,通过 "POST user/repos" 已成功创建。

但是当我尝试在这个新仓库中创建 blobs/trees/commits/references 时,会收到相同的错误信息(409)“Git Repository is empty.”。显然,我可以通过 git 命令行手动初始化该仓库,但我更希望我的应用程序能够自动完成这项任务。

有没有办法做到这一点?在创建一个空仓库后,API 中需要执行的第一件事是什么?

谢谢


2
看起来他们还不支持它,https://dev59.com/sGHVa4cB1Zd3GeqPm3ER - aclark
4个回答

3

自2012年以来,根据GitHub博客上此篇博文的说明,现在可以在创建后自动初始化存储库:

Today we’ve made it easier to add commits to a repository via the GitHub API. Until now, you could create a repository, but you would need to initialize it locally via your Git client before adding any commits via the API.

Now you can optionally init a repository when it’s created by sending true for the auto_init parameter:

curl -i -u pengwynn \
     -d '{"name": "create-repo-test", "auto_init": true}' \
     https://api.github.com/user/repos 

The resulting repository will have a README stub and an initial commit.


2
如果你想创建一个没有任何文件的空初始提交,你可以执行以下操作:
1. 使用auto_init选项创建存储库,就像Jai Pandya的答案中所述;或者,如果存储库已经存在,则使用the create file endpoint来创建一个虚拟文件 - 这将创建分支:
PUT https://api.github.com/repos/USER/REPO/contents/dummy
{ "branch": "master", "message": "为了创建一个分支而创建一个虚拟文件", "content": "ZHVtbXk=" }
这将给你一堆数据,包括提交SHA,但你可以放弃所有这些数据,因为我们即将消除该提交。
  1. 使用创建提交端点创建一个指向空树的提交:
POST https://api.github.com/repos/USER/REPO/git/commits
{ "message": "Initial commit", "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904" }

这次您需要注意返回的提交 SHA。

  1. 使用更新参考端点将分支指向您刚刚创建的提交(请注意使用了原力TM):
PATCH https://api.github.com/repos/USER/REPO/git/refs/heads/master

{
    "sha": "<提交的SHA>",
    "force": true
}
完成!您的代码库现在有一个分支、一个提交和零个文件。

1
有趣。+1。我在 https://dev59.com/UGkw5IYBdhLWcg3wm74h#9766506 中记录了空树。 - VonC

1

2013年5月更新:请注意,存储库内容API现在已经授权添加文件

请参阅“文件CRUD和存储库统计信息现在可在API中使用”。


原始答案(2012年5月)

由于似乎还不支持(如GitHub v3 API:如何为我的闪亮新存储库创建初始提交?,如aclark所述),您可以通过推送初始提交来开始。

git commit --allow-empty -m 'Initial commit'
git push origin master

无论如何,初始化自己的代码库都是一个好习惯。
而这在 "Git 的半秘密空树" 中有所说明。


谢谢。很奇怪API支持创建仓库,但不支持初始化。 - Rui Viana

1

2023年1月:Konamiman's solution的第二步对我不起作用,除非我删除具有内容api:的虚拟文件。

DELETE https://api.github.com/repos/USER/REPO/contents/dummy

{
  "branch": "master",
  "message": "Delete dummy file",
  "sha": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
}

(这个 sha 是针对空内容 ""。)

删除虚拟文件后,以某种方式 4b825dc642cb6eb9a060e54bf8d69288fbee4904 可以分配给新提交。

看起来随着时间的推移,这种情况发生了改变。依赖不受记录的API行为感觉很糟糕。 :(


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