如何获取我不拥有的分支的未合并拉取请求?


Answers:


75

要提取存储库中的内容,请执行以下操作:

git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head

然后使用FETCH_HEAD做任何您想做的事情:

git checkout -b new-branch FETCH_HEAD

1
尝试此操作,出现错误:fatal: Couldn't find remote ref refs/pull/1041/head。= /
Elias Dorneles 2015年

2
您将需要设置git@github.com:jboss/jboss-common-beans.git为remote upstream,然后执行以下操作:git fetch upstream refs/pull/4/head
Ciro Santilli郝海东冠状病六四事件法轮功

然后您如何推销公关?
Vitaliy Lebedev

不能只向PR跟踪的分支推送pull / NN / head refs(请参阅PR标题下的“用户要从user:branch-name合并... ”)。如果不是您的PR,您通常无法推送,但是有几种方法可以提供权限帮助。github.com/articles/…
Beni Cherniavsky-

如果用户更新了PR,而我想提取更新该怎么办?


21

你可以这样做:

1)添加上游遥控器:

git remote add upstream git@github.com:Particular/NServiceBus.git

2)之后,您可以根据其ID签出对新分支的任何拉取请求:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

然后,您将有一个名为NEW_BRANCH_NAMEPR的分支。

添加别名:

如果您像我一样经常这样做,则可能要为其设置一些别名。我的.gitconfig中有这个:

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

通过以上操作,我可以做到:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch

4
如果有人忘记了,请执行第3步:git checkout NEW_BRANCH_NAME
GoTop

8

对于困难的情况(尤其是如果您尚未签出git-repo),我认为最简单的方法是应用补丁。为此,只需在github上打开pull-request并在URL中添加“ .patch”,然后下载并应用该补丁即可。

例:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch


4

github /集线器

https://github.com/github/hub是GitHub CLI的帮助程序,它使用GitHub API中的额外信息很好地处理了此和其他用例。例如:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

结果:

  • 我们现在在一个<USERID>-<BRANCH_NAME>包含PR的分支上。

    请注意为我们自动设置的好分支名称。

  • 该分支设置为跟踪叉子上的原始分支,即.git/config包含:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    因此,如果进一步提交被推动,我们可以git fetch直接进行处理。

hub如果您不熟悉Go,但值得的话,在Linux上进行安装目前很麻烦。在Ubuntu 14.04上,存储库上的Go太旧了,因此GVM是最佳选择:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

我还要求GitHub在Web UI上给我们提供复制粘贴速查表,网址为:https : //github.com/isaacs/github/issues/449


1
您有任何资料来源refs/heads/ticket/NN吗?我从来没有看过这个神奇的裁判,pull/NN/head(这是hub目前给我的东西)&pull/NN/merge。只是好奇...
贝尼·切尔尼亚夫斯基-帕斯金

@ BeniCherniavsky-Paskin嗨,贝尼,我找不到任何文档。我想这是使用您自己的企业创建的API的好处。
Ciro Santilli郝海东冠状病六四事件法轮功

将使用hub的演示更改为使用其他github项目(除hub之外的其他项目)可能会有所帮助,否则可能会混淆您正在使用hub on hub的情况。
stason

看来集线器可能已更改其功能,至少我没有得到"<USERID>-<BRANCH_NAME>",但其分支名称与PR的分支名称相同,没有userid。
stason

3

一旦您将上游存储库添加为上游远程服务器(如@elias指出):

$ git remote add upstream git@github.com:Particular/NServiceBus

您可以将git配置为默认获取提取请求:

$ git config --local --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'

因此,让我们获取它:

$ git fetch upstream
Fetching upstream
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

并检查出来:

$ git checkout pr/2
Branch pr/2 set up to track remote branch pr/2 from upstream.
Switched to a new branch 'pr/2'

3

这是对我有用的命令。

我假设一个人已经在本地将一个仓库(例如pytorch)克隆到他/她的系统中。此后,一些志愿者/发烧友贡献了一些代码并向远程存储库发布了PR,但尚未将其合并到master或任何其他分支中。所以,

首先,我们必须git remote add对github远程存储库进行操作:

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

然后cd进入存储库pytorch,然后只需执行以下操作:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

现在,待处理的PR已提取到您的本地存储库中,并且提取的提示将在FETCH_HEAD中。如果您想在本地合并该挂起的PR ,则只需执行以下操作:

$ git merge FETCH_HEAD

之后,如果您这样做:

$ git status

您应该能够看到本地仓库n在作为未决PR的提交之前(即,在一个PR中可以发布1个以上的提交)。因此,提交的数量取决于挂起的PR中包含的提交。


0

下面是使您的'git fetch'命令在运行“ git fetch”时获取所有拉取请求

在下面添加到〜/ .gitconfig

[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*

请注意,引用“ refs / pull-requests /”具有隐藏命名约定,对于git hub,您可能需要使用其他格式


0

如果您只是想将其他回购中的一个未合并的“拉取请求”添加到自己的请求中,则不需要所有复杂性(如其他答案中大多数所示)。

相反,只需进入自己的仓库,并使用其提交哈希值(从PR源)提取提交即可。

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

这样,您将只有一堆新的编辑文件,就像您自己编辑它们一样。如果要使用某些标签/标签来提交这些内容,则取决于您。

然后,如果您想将所有新闻推送到您自己的GitHub存储库中,请像往常一样执行操作:

git commit -m "Added something by Anonymous"
git push -u origin master

0

Github有明确的文档将合并请求合并到本地仓库中:

https://help.github.com/en/articles/checking-out-pull-requests-locally

归结为知道GitHub中的拉取请求只是基础存储库中的分支,其中分支名称是序列号。上面的文章向您展示了如何找到该数字以及git命令行魔术师如何使用您想要的任何分支名称将其拉入本地存储库。

我找不到类似的简单方法将合并请求合并到我在GitHub上创建的fork中。


0

我找到了解决此问题的解决方案-从不同机器上的未合并PR中提取更改,我在git bash 1上进行了以下操作。您必须在机器2上进行了远程存储库的克隆2.执行git checkout(在其上生成PR的分支) 3.做git pull并完成!!!!!!


0

这是来自GitHub文档的解决方案:

从您的项目存储库中,签出一个新分支并测试更改。

git checkout -b GithubUserID-branchName branchName
git pull https://github.com/GithubUserID/reponame.git branchName

哪里:

  1. GithubUserID 是打开请求请求的人的用户名。
  2. branchName 是分支的名称,例如master
  3. reponame 仓库名称,如demo-todo

范例:

git checkout -b felix123-master master
git pull https://github.com/felix123/demo-todo.git master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.