【问题标题】:GitHub clone from pull request?从拉取请求克隆 GitHub?
【发布时间】:2013-02-03 13:28:52
【问题描述】:

我想从 GitHub 克隆一个存储库。问题是我不想要主分支;我想要this unapproved pull request中的版本。

我是否可以克隆拉取请求版本而不是主存储库?

【问题讨论】:

标签: git github pull-request


【解决方案1】:

该拉取请求显示来自该人的分支的提交,因此您可以看到他正在从 feature/mongoose-support 分支推送他的更改。

您可以克隆他的存储库并签出该分支

【讨论】:

    【解决方案2】:

    您可以使用-b 选项和拉取请求克隆您想要的分支:

    git clone https://github.com/user_name/repo_name.git -b feature/pull_request_name dir_name
    

    在您的情况下,您要克隆的分支是拉取请求的源分支(feature/mongoose-support):

    git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support
    

    【讨论】:

      【解决方案3】:

      当用户提交拉取请求时,他们要求将一些更改从其分叉克隆上的分支合并回另一个用户的存储库。

      您想要的更改可以从拉取请求的来源获得。为此,请克隆用户的存储库 (git://github.com/berstend/frappe.git),然后检查他从 (feature/mongoose-support) 创建拉取请求的分支。

      【讨论】:

        【解决方案4】:

        您可以按照this gist 中的说明直接签出远程,而无需弄清楚它们的存储库和分支。

        使用示例

        对于我的一个项目 (github3.py),我的 github3.py/.git/config 中有以下内容

        [remote "github"]
            fetch = +refs/heads/*:refs/remotes/github/*
            fetch = +refs/pull/*/head:refs/remotes/github/pr/*
            url = git@github.com:sigmavirus24/github3.py
        

        第一行是每个遥控器的标准,除了github 被遥控器的名称替换。这意味着远程头(或该服务器上的分支头)被“映射”到以github/ 为前缀的本地远程。因此,如果我做了git fetch github 并且在 GitHub 上有一个在我的机器上本地尚未注意到的分支,它会下载该分支,我可以像这样切换到它:git checkout -t github/branch_name

        第二行做同样的事情,但它是为拉取请求而不是标准的 git 分支做的。这就是您看到refs/pull/*/head 的原因。它在 GitHub 上获取每个拉取请求的头部并将其映射到 github/pr/#。因此,如果有人发送拉取请求并且它的编号为 62(例如),您会这样做:

        git fetch github
        git checkout -t github/pr/62
        

        然后您将位于名为pr/62 的本地分支上(假设它尚不存在)。这很好,意味着您不必跟踪其他人的遥控器或分支。

        【讨论】:

        • 为什么不呢?它准确地解释了如何以一种方便有效的方式做到这一点。
        • 因为我是菜鸟,而且那个文件很难看懂。我永远不会从 gist 文档中的“没有得到它”到git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clone
        • gist 文档所做的是添加一组额外的信息(参考或参考)以从 GitHub 获取。当您执行git fetch github 时,您可以执行git co -t github/pr/#。这使您不必复制和粘贴远程 URL、找出分支名称等。然后您就可以轻松获得名称良好、简洁准确的分支名称。但我知道这似乎势不可挡。
        • 哦,太好了。我不知道这个+1!你能给我一个完全合格的例子吗?
        • @sigmavirus24 非常感谢您提供的信息;我想知道 bitbucket 是否存在类似的技巧?
        【解决方案5】:

        最简单的方法是这样的:

        git fetch origin pull/2/head
        git checkout -b pullrequest FETCH_HEAD
        

        您现在将位于处于拉取请求状态的新分支上。

        您可能想通过运行设置别名

        git config --global alias.pr '!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'
        

        现在您可以通过运行git pr <pr_number>git pr <pr_number> <remote> 来检查任何 PR,如果您的 github 远程未命名为 origin

        【讨论】:

        • 更好:git fetch origin pull/<#>/head:<local_branch_name> (via)
        • 我发现自己经常引用这个 SO 答案,所以我把它放到了我的 .gitconfig 文件中 [alias]:pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f" 下。这样我只需输入git pr upstream 62,接下来我知道,我在来自上游的 PR #62 的新分支上!如果你总是使用origin,你可以硬编码它而不是$1,但这对我来说会改变。
        • @matt 假设您有一个名为co的结帐别名
        • 添加提交时如何拉取它? --set-upstream-to 似乎不起作用。有没有比git fetch ... && git reset --hard FETCH_HEAD更好的方法?
        • 这对我不起作用:github.com/cgustav/lite_rolling_switch/pull/15/commits 所以我在这里找到了拉取请求的来源:github.com/Elvis-Sarfo/lite_rolling_switch/tree/… 并克隆了它。
        【解决方案6】:

        安装后git-extras

        (cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)
        

        您可以简单地使用git pr

        $ git pr 62 [remote]
        

        【讨论】:

          【解决方案7】:
          git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH
          

          例如:

          git fetch origin pull/611/head:pull_611
          git checkout pull_611
          

          进行更改、提交、推送并在 GitHub 上从您的 fork 中打开新 PR

          【讨论】:

          • 如何在本地合并这些分支?我刚刚克隆并获取了一个未合并的拉取请求,如上所述。并尝试了结帐分支名称。但我的 IDE/文本编辑器中没有出现任何更改。
          【解决方案8】:
          git clone git://github.com/dweldon/frappe
          cd frappe
          git pull origin pull/2/head
          

          How can I fetch an unmerged pull request for a branch I don't own?

          【讨论】:

          • 注意git pull 创建一个合并到当前分支;通常对于 PR,您只需 git fetch 即可获取原始作者的代码(然后可以作为 FETCH_HEAD 访问)。如果您确实想要合并,还值得一提的是 pull/2/merge(而不是 pull/2/head)——这使得 GitHub 为您提供如果您现在单击 [Merge] 按钮将会发生的确切合并提交。
          【解决方案9】:

          对我来说,就是这么简单

          git fetch origin pull/4/head
          

          在这里找到4

          【讨论】:

            【解决方案10】:

            与 Github 官方新 command line interface:

            gh repo clone org/repo
            cd repo
            gh pr checkout 44
            

            44 是 PR 编号,但也可以是分支名称。


            查看更多 details and optionsinstallation instructions

            【讨论】:

              【解决方案11】:

              带有“-b”选项的接受答案对我不起作用,所以这就是我最终得到的。在 Github 中创建拉取请求后,您将被带到可以看到如下内容的页面,其中“ogryb”是我的用户名,“patch-1”是分配给它的自动生成的名称。

              您现在需要做的就是单击右侧突出显示的名称,这将带您进入带有以下链接的页面:

              点击绿色“代码”按钮右侧,可以看到一个漂亮的个性化 git 链接,可用于克隆或对现有拉取请求添加更多更改。

              【讨论】:

              • 这对于克隆其他人的拉取请求是不利的,如果他们已经对其分叉进行了克隆人不想要的其他更改。
              【解决方案12】:

              列出和获取 PR 的 BitBucket 约定:

              git ls-remote origin 'refs/pull-requests/*'
              git fetch origin refs/pull-requests/998/from:local-branch-name
              

              全文在这里:https://www.atlassian.com/git/articles/pull-request-proficiency-fetching-abilities-unlocked

              【讨论】:

                【解决方案13】:

                要将 PR 拉到您当前的分支,请使用:

                git pull origin pull/418/head

                这里pull/{no. of PR}/head

                【讨论】:

                  猜你喜欢
                  • 2014-04-01
                  • 2016-10-01
                  • 2017-07-04
                  • 2013-02-01
                  • 2011-11-13
                  • 2021-10-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-01-15
                  相关资源
                  最近更新 更多