【问题标题】:Forking a GitHub repo using from the command line with bash, cURL, and the GitHub API使用 bash、cURL 和 GitHub API 从命令行分叉 GitHub 存储库
【发布时间】:2017-10-31 15:12:47
【问题描述】:

我在使用 cUrl 分叉 GitHub 存储库时遇到问题。
creating a fork 的 gitHub API 文档。

我尝试了很多变化:

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\"}"

关于如何从命令行创建一个 repo 的分支有什么想法吗?

我有一个 bash 脚本: - 在 github 上使用我要克隆的 repo 的名称创建一个空 repo, - 从本地另一个用户那里克隆一个 repo,并且 - 将我克隆的 repo 推送到我在我的 github 帐户中创建的空 repo - 适当地设置源和上游遥控器

但是,此方法不会在 GitHub 内保持与源(分叉)存储库的连接。我特别喜欢出现在我自己的仓库名称下方的分叉链接的便利性;-)

目标是从命令行完成我所有的克隆(和分叉)。

我不想打开浏览器,导航到我希望 fork 的存储库,只是为了访问那个“Fork”按钮.. 只返回命令行来完成这个过程。

或者,我可以从命令行将克隆的 repo 转换为分叉的 repo 吗? (例如,一些命令行 api 命令将重新创建 fork 拥有的那些内部 github 链接?)

【问题讨论】:

标签: bash curl github fork github-api


【解决方案1】:

我用这个命令在github企业上fork:

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
}

【讨论】:

    【解决方案2】:

    使用 hub 命令行工具创建或派生 repo 要容易得多。

    安装说明:https://github.com/github/hub#installation

    它可以做更多事情,但这里是使用命令行创建在线 repo 的方法。
    然而,那里有相互矛盾的信息,所以它可能是一个 有点混乱。

    要分叉别人拥有的在线回购,请执行以下操作:

    1. 使用git clone克隆repo

    git clone ssh://git@github.com/keras-users/keras.git

    1. 更改为克隆的仓库

    cd keras

    1. 在线创建分叉

    hub fork

    fork 你自己的已经托管在 github 上的 repo:

    Github 不允许您创建自己的 repo,
    因此,您需要先在您的计算机上创建自己的 repo 的克隆,
    然后你可以在github网站上创建克隆的repo

    1. 将您的存储库克隆到您的计算机上

    git clone ssh://git@github.com/alpha_beta_gamma/clone_repo.git

    1. 将您计算机上的 repo 克隆到另一个 repo(也在您的计算机上)

    git clone clone_repo clone_repo2

    1. 将目录更改为新的克隆存储库

    cd clone_repo2

    1. 在 Github 上创建克隆的 repo

    hub create

    这将在 GitHub 上创建一个新的存储库。

    1. 设置远程仓库的 URL:

    git remote set-url https://github.com/username/clone_repo2

    1. 将本地仓库推送到在线仓库

    git push

    【讨论】:

      【解决方案3】:

      我使用hub。 我还设置了git 作为它的别名,这样我就不必担心每次git 下的命令和hub 下的命令,所以我的代码看起来就像我在运行的 git。关注安装here

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

      PS:要使上述代码正常工作,在您的.bashrc.bash_profile 中执行之前,您需要输入以下内容

      alias git=hub
      

      【讨论】:

        【解决方案4】:

        这是我的工作 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 选项时,
        我不得不将-d '' 移动到 在 URI 之后
        - 如果放在 -u 'username' 和 URI 之间会导致登录错误。

        事实证明,我使用 bash 语法的脚本中的主要错误来源。
        我在 bash 变量周围加了引号,那不应该存在。
        (..只是在不真正了解 bash 或 curl 的情况下解决痛点)

        此外,正如#YuriSchimke 指出的那样,这个特定的 URI 需要在 URI 中传递参数。与创建新空白存储库的 URI 不同,将这些选项作为 json 传递不是一种选择。

        这就是为什么我对如何在 URI 中发送这些数据感到困惑的原因:

        使用 curl,default request is a GET
        curl, POST requests 中添加-d(相当于--data)标志,后跟要发送的数据。

        我需要发送一个 POST 请求。
        GitHub API 的格式是 GET(和 POST 例如 CreateRepo)请求有时可以send some parameters as json or query strings
        注意:GitHub API 的文档似乎有些不完整,因为我没有看到任何提及允许 json 的 API,只允许查询字符串。
        我想在这种情况下,数据夹在两个静态 URI 部分之间,因此无法作为 json 值发送。

        我不知道如何在没有数据的情况下使用-d 标志

        如果我只是将其关闭,API 调用将作为 GET 处理。
        它返回了关于我想分叉的 repo 的信息,
        而不是 forking 我的帐户的回购。

        @YuriSchimke's post 给了我“啊哈!”。谢谢!我笑着说我没想到。我很感激尤里把这点说得如此明显! (再次感谢)。

        【讨论】:

          【解决方案5】:

          文档显示所有者和 repo 是请求 URI 的一部分

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

          https://developer.github.com/v3/repos/forks/

          这似乎工作正常。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-13
            • 1970-01-01
            • 2018-12-01
            • 2012-04-01
            • 1970-01-01
            • 2023-01-25
            相关资源
            最近更新 更多