0

我遵循通用的 OSS 结构:

  1. 托管在 GitHub 上的 OSS 远程存储库
  2. OSS远程存储库的一个分支到我自己的远程存储库
  3. 在我的远程存储库上克隆 fork 以创建本地存储库

因此,贡献者将在本地创建一个新分支,将更改推送到他/她的远程存储库,然后向 OSS 的远程存储库打开一个拉取请求。

这一直运作良好。但是,当我尝试通过在本地摆弄其他贡献者的拉取请求来查看它时,主要问题就出现了。

因此,我使用以下命令获取了对 OSS 远程存储库的拉取请求:

git fetch upstream pull/<PR#>/head:<branchName>

其次是git checkout <branchName>

它是成功的。我玩弄了 PR,并在 GitHub 上对其进行了审查。然后,贡献者通过将新提交推送到他们的分支(在他们的远程仓库上)来更新 PR,这会自动反映在 PR 中。

现在,我希望能够在本地获取更新,以便再次尝试更改。我了解我的 PR 分支副本默认不跟踪远程分支,所以我尝试将其设置为跟踪 PR:

git branch --set-upstream upstream/pull/<PR#>/head:<branchName>

就像我第一次取树枝时所做的那样。然而,我得到的回应是

错误:请求的上游分支 'pull//head:' 不存在

我再次尝试:

git branch --set-upstream-to upstream/pull/<PR#>/head:<branchName>

这也因同样的错误而失败。

然后,我想,是不是因为 PR 就像是某人远程存储库上分支的“反映”,所以如果我想跟踪上游分支,我应该从该人的远程存储库中跟踪?

所以我将贡献者的远程存储库添加为远程,并再次尝试:

git branch --set-upstream-to <newRemote> <branchName>

我仍然面临同样的错误。

我做了一些谷歌搜索,发现了这个,但我不想获得所有的拉取请求。我还找到了这样的链接但不是,不是我需要的帮助。

谁能指出我现在做事的方式有什么问题?谢谢!

编辑:除了下面的 Marina Liu - MSFT 提出的建议之外,还有更简单的方法吗?

4

2 回答 2

1

问题——或者至少是第一个问题——是你不能使用上游来引用 GitHub 拉取请求参考。

在 Git 中,分支上的上游由两部分组成:

  • 遥控器的名称,例如origin
  • 该远程分支的名称,例如master

Git 将这两者放在一起得到——这是遥控器上refs/heads/master的名称——然后通过遥控器的设置运行这个字符串fetch。远程命名的标准fetch设置origin+refs/heads/*:refs/remotes/origin/*,因此如果上游当前设置为对 < origin, >,Git 在您自己的存储库中master查找的名称是,这是您的远程跟踪名称。refs/remotes/origin/mastermaster

请注意这里假设遥控器上的名称以refs/heads/.

refs/pull/GitHub 上拉取引用的实际名称以, not开头refs/heads/,因此您想要的拉取请求 #123 的提交的全名是refs/pull/123/head. 没有办法拼写这个开头,refs/heads/因为这不是一个分支名称。

现在,您可以按照第一个链接中的建议添加一个额外的fetch设置:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

这导致他们refs/pull/123/head与您的refs/remotes/origin/pr/123. 根据您特定的 Git 版本,其中一些有时甚至大部分都有效。某些 Git 版本有时会变得相当混乱。如果您尝试它并且它对您有用,那很好,如果您出于某种原因升级或降级 Git 版本,请准备好清理一些混乱。

通过您的第二个链接找到的别名更好。这些从一个特定的拉取请求中获取,创建一个本地分支名称(或者如果它已经存在则覆盖它——这有点危险,但只要你不命名自己的分支就可以了)。您可以改进它们,编写一个创建本地分支的真实脚本(确保使用全名格式 ,以保证正确性)并设置一些附加信息,以便在您位于该分支时自动更新该分支。pr/integergit-prrefs/heads/pr/numbergit pr

(如果我有空闲时间,我可能会编写自己的脚本,因为这样会很方便。)

于 2018-04-11T06:38:29.217 回答
1

您可以使用以下任何选项来更新本地 repo 中的 PR。

选项1:删除本地源分支并重新创建以获取更新

当您使用命令在本地获取 PR 的源分支时:

git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>

如果 PR 已更新(新提交被推送到 fork 存储库),您可以通过以下方式删除并重新创建:

git checkout master
git branch -D <branchname>
git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>

选项 2:将 fork 存储库添加为本地存储库的远程

您可以通过以下方式将 fork 存储库添加为本地存储库的远程

git remote add fork1 <URL for the fork repo> -f

然后您可以通过以下方式为 PR 源分支创建本地分支

git checkout -b <branchname> fork1/<branchname>

如果 PR 已更新,您只需执行以下命令即可获取更新:

git fetch fork1
git checkout <branchname> #If HEAD is not on the <branchname>
git reset --hard fork1/<branchname>
于 2018-04-11T06:39:47.627 回答