本地检出Bitbucket拉取请求

42

我找到了这个要点,展示了如何从GitHub本地检出pull请求。

我正在使用Bitbucket,并正在寻找类似的功能。

你能帮我吗? 谢谢

11个回答

32

可以使用以下方式从Bitbucket Server的拉取请求中获取代码:

git fetch origin refs/pull-requests/$PR_NO/from:$LOCAL_BRANCH

9
无法使用,出现以下错误:fatal: Couldn't find remote ref refs/pull-requests/2/fromUnexpected end of command stream - Anuruddha
你在使用进程或线程的分叉吗? - Ducaz035
1
你的远程源是否设置为主仓库?因为如果你将其设置为你的分支,那么 git fetch origin 将会失败。 - Ducaz035
@Ducaz035 感谢您的答复! 这对我在 Bitbucket Server 实例上有效(即由 @zmo 指示的自托管版本)。 - jtpereyda
1
Stash在2015年9月更名为Bitbucket,这个答案是来自2015年11月的,所以从技术上讲是正确的。搜索“bitbucket fetch pull request”或类似内容的人们将会找到这篇stackoverflow帖子,因此贬低它是相当无用的。 - BlackEye
显示剩余3条评论

23

我发现这个答案,并认为在Bitbucket上获取拉取请求的引用是可能的。

但实际上不行。

对于OP的问题,答案是不可能的:有一个关于此问题的未回答和未处理的功能请求问题已经存在了七年之久。

解决方法?

您可以将PR作为可下载的.patch文件下载并应用到手动创建的新分支上。但是您不容易能够应用更新。

我想出了另一种方式,在git-repo中实现了这种方式,因此每个人都可以使用它。我所做的是使用API获取PR的远程和分支,并自动在本地创建新的upstream和分支。这样,您就可以从PR发布者那里获取更新。缺点是git remotes的杂乱。

编辑:我希望这能实现并关闭功能请求。但是,专用Bitbucket服务器上已经有了此解决方法,但是在bitbucket.org服务上没有。 6月5日,一位Bitbucket工作人员在此票证上发表了评论:

大家好--再次感谢您对此问题的反馈和耐心等待。该功能仍然是待办事项中优先级较高的项目。当我们有更多关于此功能预计交付时间的信息时,我们将在此处分享。


2
我成功地下载了一个补丁,运行以下命令:`#下载补丁文件。 curl -u user:password https://bitbucket.org/api/2.0/repositories/{user}/{repo}/pullrequests/{pull_no}/patch -L -o name.patch#将补丁文件应用到本地的Git checkout中。 git apply name.patch` - Alexandre Magno Teles Zimerer
1
由于现在可以在Bitbucket上获取拉取请求的引用(请参见答案https://dev59.com/fV8e5IYBdhLWcg3wNYQn#54907574),因此投票反对。 - Alex Gidan
1
从本月的功能请求中,一名员工表示您的答案适用于专用的Bitbucket服务器,但不适用于bitbucket.org网站。我还没有测试过,但一旦有人确认它可以工作,或者相关的功能请求被关闭,我会相应地更新我的答案。在那之前,很遗憾它还没有解决 ¯_(ツ)_/¯ - zmo
1
refs/pull-requests/$PR_NO/merge - 它适用于Butbucket v5.14.1。 - Alerkesi
据我所知,这个问题仍然没有解决,这意味着一切都是 ¯\(ツ)/¯。 - zmo
显示剩余6条评论

19

我遵循了这篇文章Pull request Fetching

它的确起作用了,但我发现我只需要在当前存储库中添加一行即可,而不是创建一个派生存储库和上游存储库。运行此行

git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'

您还可以将其手动添加到项目中的文件 .git/config 中。

接下来运行git pull你应该会看到一个列表:

  • [new ref] refs/pull-requests/488/from -> origin/pr/488
  • [new ref] refs/pull-requests/666/from -> origin/pr/666

然后您可以运行git checkout origin/pr/666以获得拉取请求更改。


谢谢,这在最新版本的BitBucket Server上运行得很好。 - gareth_bowles
如果我使用 git config --add remote.origin.fetch '+refs/pull-requests/*/from:pr/*' 会发生什么呢?在我看来似乎是一样的? - Mark
“pull request changes” 不是指“pull request”本身,而是指谁批准、谁评论、审查何时开始和结束……这都是PR的一部分。 - David V. Corbin

16

获取/检出拉取请求

这适用于Bitbucket。其他服务器可能具有不同的refs:refspecs),或者根本没有refs:

第一次

首先,您需要添加远程仓库的拉取请求refs:。要对存储库(例如别名为“upstream”)执行此操作:

git config --add remote.upstream.fetch '+refs/pull-requests/*/from:refs/remotes/upstream/pull-requests/*'
也就是说,您需要在 git 的.config 文件中添加最后一行:
[remote "origin"]
   url = ssh://git@git.blablabla.net/~user/repository.git
   fetch = +refs/heads/*:refs/remotes/origin/*
   fetch = +refs/pull/*/head:refs/remotes/origin/pull-requests/*

获取

然后,如果你执行远程的 获取 ,你应该可以看到检索到了所有的拉取请求:

git fetch upstream

From ssh://git.blablabla.net/somepath/repository
 * [new ref]         refs/pull-requests/1188/from -> upstream/pull-requests/1188
 * [new ref]         refs/pull-requests/1741/from -> upstream/pull-requests/1741
 * [new ref]         refs/pull-requests/2394/from -> upstream/pull-requests/2394

结账

最后,您可以结账您喜欢的拉取请求:

git checkout pull-requests/2723

已成功测试于专用的Bitbucket服务器 2019年2月27日。


4
太棒了@alex-gidan!完美地解决了问题。如果使用与Bitbucket兼容的版本,这将成为我2019年的首选答案。👍 - bkidd
4
@bkidd 我同意,让我们把这个答案推到前八名吧 8) - Katie
1
Bitbucket Server拥有所有好的功能 :( - sameetm
1
这是最直接的答案。 - Bruno Alexandre Rosa
1
这还有效吗? - wpsd

3
如果您使用 fork,那么“origin”可能是您的 fork,因此首先应该添加主要远程仓库。 点击存储库页面上的“Clone”按钮,获取主要远程仓库的 URL,就像克隆存储库时一样。
git remote add upstream $UPSTREAM_URL

获取拉取请求。
git fetch upstream refs/pull-requests/$PR_NO/from:$LOCAL_BRANCH

查看新分支

git checkout $LOCAL_BRANCH

2

如果无法检出拉取请求,一个小技巧是可以检出该拉取请求的最后一次提交

将原始回答翻译为“最初的回答”

git checkout <hash code of last commit>

这就是我一直在寻找的! - Victor Eronmosele

1
如果您正在使用分叉存储库并且想要从原始或其他存储库拉取PR,则请使用以下命令。
 1. git fetch ${URLofOriginalRepo}
    “+refs/pull-requests/*/from:refs/remotes/origin/pr/*” 
 2. git checkout origin/pr/${PR_NUMBER}

URLOfOriginalRepo是您想要拉取PR的存储库的URL。此URL是使用ssh密钥克隆存储库时使用的URL。

运行这些命令后,您可以在此存储库上查看打开的PR。然后拉取您想要的那个。

例如。

git fetch ssh://hostname.net:8080/repofolder/repo.git.git “+refs/pull-requests//from:refs/remotes/origin/pr/” && git fetch origin/pr/854


0
在 Bitbucket 中,您可以做的是:
git config remote.origin.fetch "+refs/heads/:refs/remotes/origin/"

然后

git fetch

之后您可以切换到想要的分支进行检出

git checkout BRANCH_NAME

附言:希望Bitbucket能解决这个问题https://jira.atlassian.com/browse/BCLOUD-5814


0

我在Bitbucket中发现这很困难,所以我尝试了不同的方法。如果一个人向我的Bitbucket仓库提交了拉取请求,我会通过他的名字(比尔)设置他(比尔)的源。然后是这个 -

git checkout -b bill-auth bill/bill-auth 

这里的 bill 是指贡献者的仓库源/链接,然后 bill-auth 是他的分支名称。

在这里,我正在创建一个与他(bill)的特性分支同名的分支。


0

git fetch origin refs/pull-requests/$PR_NO/merge - 这适用于Butbucket v5.14.1


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