使用bash、cURL和GitHub API从命令行fork一个GitHub存储库

7
我在使用bash脚本fork Github时遇到了问题,我用cUrl尝试了多种变化。创建fork的GitHub API文档如下:creating a fork
我尝试了以下两种方式: curl -u $my_user_name https://api.github.com/repos/forks -d "{\"owner\":\"$upstream_repo_username\",\"repo\":\"$upstream_repo_name\"}"curl -u $my_user_name https://api.github.com/repos/'$upstream_repo_username'/'$upstream_repo_name'/forks 但是都返回以下错误: { "message": "Not Found", "documentation_url": "https://developer.github.com/v3" }
相比之下,以下命令可以成功地创建一个空的Github repo: curl -u $my_user_name https://api.github.com/user/repos -d "{\"name\":\"$upstream_repo_name\"}" 有没有想法通过命令行来fork一个repo呢? 我有一个bash脚本: - 在github上创建一个名为要克隆的存储库的空存储库, - 从另一个用户本地克隆一个存储库, - 将我的克隆存储库推送到我在github账户中创建的空存储库中 - 设置适当的源和上游远程
然而,这种方法无法在GitHub上与源(forked)repo保持连接。我特别喜欢forked链接出现在我的自己的repo名称下面这个方便的功能。
目标是通过命令行完成所有克隆(和fork)操作。我不想打开浏览器,导航到我要fork的存储库,只是为了访问" Fork "按钮...然后回到命令行完成过程。
或者,我可以通过命令行将克隆的repo转换为forked repo吗?(也就是说,一些命令行api命令将重新创建forks具有的那些内部github链接吗?)

这可以通过来自GitHub的hub工具轻松完成:https://dev59.com/V6Lia4cB1Zd3GeqPfC-D#49738033 - alpha_989
5个回答

7

这是我的工作Bash脚本:

curl -u $my_user_name https://api.github.com/repos/$upstream_repo_username/$upstream_repo_name/forks -d ''

使用硬编码字符串而不是bash变量的示例:

curl -u 'SherylHohman' https://api.github.com/repos/octocat/Hello-World/forks -d ''

注意,我将-d''移到末尾以避免登录错误。
该请求需要身份验证。
我通过curl的-u参数提供这个参数(而不是使用OAuth2)。
当我使用-u $my_user_name选项时,
我不得不在URI之后移动-d''
- 如果放在-u'username'和URI之间会导致登录错误。 事实证明,我的Bash语法脚本中的主要错误源自引号。
我在Bash变量周围加上了引号,这些引号不应该存在。
(只是为了解决痛点,而并不真正了解Bash或curl)
此外,正如#YuriSchimke指出的那样,这个特定的URI需要将参数传递到URI中。将这些选项作为json传递不是一个选项,与创建新空白repo的URI不同。
这就是为什么我对如何在URI中发送这些数据感到困惑的原因:
使用curl时,默认请求为GET
curl中,POST请求是通过添加-d(相当于--data)标志后跟要发送的数据来完成的。
我需要发送一个POST请求。
GitHub API的格式是,GET(和POST 例如CreateRepo)请求有时可以将一些参数作为json或查询字符串发送
注意:GitHub API的文档似乎略微不完整,因为我没有看到任何提及API允许json,只有查询字符串。
我想在这种情况下,数据夹在两个静态URI部分之间,使其无法像json值一样发送。 我不知道如何在没有数据的情况下使用-d标志: 如果我只是省略了它,API调用将被处理为GET请求。它会返回关于我想要fork的repo的信息,而不是将repo fork到我的账户中。
@YuriSchimke的帖子给了我那个“啊哈!”时刻。谢谢!我笑了,没想到这一点。我很感激Yuri让这变得如此明显!(再次感谢)。

3
文档显示所有者和存储库是请求URI的一部分。
curl -d '' https://api.github.com/repos/octocat/Hello-World/forks
https://developer.github.com/v3/repos/forks/ 这个链接看起来很好用。这似乎很正常。

3
使用hub命令行工具创建或fork一个repo要容易得多。
安装指南:https://github.com/github/hub#installation 它可以做更多的事情,但这里是如何使用命令行fork一个在线repo。
然而,有冲突的信息,所以可能有点混乱。 要fork别人拥有的在线repo,请执行以下操作: 1. 使用git clone克隆repo。 git clone ssh://git@github.com/keras-users/keras.git 2. 切换到已克隆的repo。 cd keras 3. 在线创建分支。 hub fork 要fork自己已经托管在Github上的repo: Github不允许您fork自己的repo,因此您需要先在计算机上创建自己repo的克隆副本,然后可以在Github网站上创建克隆repo。
1. 克隆repo到您的计算机。 git clone ssh://git@github.com/alpha_beta_gamma/clone_repo.git 2. 将计算机上的repo克隆到另一个repo(也在计算机上)。 git clone clone_repo clone_repo2 3. 更改目录以进入新克隆的repo。 cd clone_repo2 4. 在Github上创建克隆repo。 hub create 这将在GitHub上创建一个新的repo。
5. 设置远程repo的URL: git remote set-url https://github.com/username/clone_repo2 6. 将本地repo推送到在线repo。 git push

0

我使用hub。 我还将git设置为别名,这样我就不必每次担心哪个命令属于git,哪个属于hub,所以我的代码看起来就像我在运行git一样。请按照此处的安装步骤进行安装。

$ git clone <github_repo>
$ cd <github_repo>
$ git fork

注意:为了使上述代码正常工作,在执行它之前,你需要将以下内容放置在你的.bashrc.bash_profile文件中

alias git=hub

0

我使用了这个命令在Github企业版上进行分支:

curl -vX POST \
    https://git.redacted.com/api/v3/repos/$upstream_repo_username/$upstream_repo_name/forks?access_token=$api-token \
    -d @gh-fork.json \
    --header "Content-Type: application/json"

gh-fork.json:

{
    "organization": "org-to-fork-to",
    "description": "",
    "homepage": "https://git.redacted.com",
    "private": false
}

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