我知道How can I check out a GitHub pull request?
将.git/config
添加到[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
确实允许提取和结帐,拉动操作失败:
$ git fetch origin
获取和结帐工作正常:
$ git checkout -b "pr-123" origin/pr/123
Branch pr-123 set up to track remote branch pr/123 from origin.
Switched to a new branch 'pr-123'
......一切都很好
$ git pull
Your configuration specifies to merge with the ref 'refs/heads/pr/123'
from the remote, but no such ref was fetched.
...成功,得到了代码!
但拉动失败了:
$ git pull origin refs/pull/123/head
...失败。
我可以手动指定参考:
[branch "pr-123"]
remote = origin
merge = refs/heads/pr/123
这是有效的。但是如何配置配置文件以便:
我发现如果我编辑配置文件并更改:
[branch "pr-123"]
remote = origin
merge = refs/pull/123/head # <-- here is the change
为:
git pull
...然后re
工作正常。如果不为每个拉取请求手动编辑配置文件,如何实现这一目标?
答案 0 :(得分:8)
您只提取了分支,而不是提取请求。将其添加到您的配置中:
fetch = +refs/pull/*/head:refs/pulls/origin/pr/*
之后你可以签出一个指向PR远程ref的分支:
git checkout -b "pr-123" pulls/origin/pr/123
一般情况下,如果你从遥控器中取出了它,你可以查看一个引用,所以查看git fetch
命令输出并找到PR的引用名称。这就是你应该放在checkout
命令中的内容。你应该看到类似的东西:
[new ref] refs/pull/123/head -> refs/pulls/origin/pr/123
请注意,您可以将pulls
部分替换为任何自定义前缀。您现在可以创建一个分支并将其指向pulls/origin/pr/123
,这相当于refs/pulls/origin/pr/123
(请参阅git refspec doc)。
答案 1 :(得分:3)
从获取规范中无法明确找到远程引用refs/remotes/origin/pr/123
跟踪origin:refs/pull/123/head
,因为origin:refs/heads/pr/123
也是可能的。为了提供帮助,您可以使用不同的远程名称,例如:
[remote "origin-pr"]
url = <same as for origin>
fetch = +refs/pull/*/head:refs/remotes/origin-pr/pr/*
然后使用显式分支名称(应该在GUI中可用)的git checkout将能够创建正确的跟踪引用:
$ git checkout -b pr/123 origin-pr/pr/123
[branch "pr/123"]
remote = origin-pr
merge = refs/pull/123/head
虽然看起来不可能简单地git checkout br/123
工作:
$ git checkout pr/123
error: pathspec 'pr/123' did not match any file(s) known to git.
答案 2 :(得分:2)
一种正确的方法是使用hub! :)
$ brew install hub
$ hub checkout https://github.com/github/hub/pull/123
...
$ hub pull
Already up-to-date.
它有额外的工具来处理Github拉取请求,例如
hub pull-request
答案 3 :(得分:1)
我认为我找到了一个解决方案,而且简单得令人难以置信:fetch = +refs...
行的顺序很重要!
我改变了:
[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
为:
[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
fetch = +refs/heads/*:refs/remotes/origin/*
(交换最后两行)
现在一切正常(fetch
,checkout
,pull
)。
我还在等待看到这个配置存在一些(未)预期的问题,但到目前为止还是那么好......