简短版:远程分支上名为
pr/34
的分支变成了您的
origin/pr/34
。但是,远程上名为
refs/pull/34/head
的引用也变成了您的
origin/pr/34
。但它们不能同时成为那样,因此git会出错并退出。无论是设置分支映射的任何内容都与在github上设置pull请求分支的任何内容都不兼容(但我对这两个软件都不了解)。
也许删除
+refs/pull/*/head:refs/remotes/origin/pr/*
fetch
配置行是合理的(我不确定)。或者,您可以将它们映射到其他本地参考名称空间,例如
refs/pullreqs/origin/*
(但这样的参考名称有点难以输入)。如果每个拉取请求都将在github上创建
bothrefs/heads/pr/number
和refs/pull/number/head
,我建议删除一个配置行。
问题来源的较长解释如下。给定以下内容:
+refs/pull/*/head:refs/remotes/origin/pr/*
+refs/heads/*:refs/remotes/origin/*
+refs/heads/*:refs/remotes/origin/*
从 "git config --get-all remote.origin.fetch" 的输出中,我可以解释出问题所在。 “如何修复” 取决于您想要的结果。
每个输出行都是一个“refspec”,由三个部分组成:左侧的“+”符号,两个“:”之间的名称和右侧的名称。两个名称中都允许使用一个 “*”,它的工作方式类似于文件名中的“*”匹配,例如“*.c”,“*.py”等,在第二个“*”处使用第一个“*”匹配的内容。不管怎样,在下面应该很明显。
(最后一行是多余的,因此无害,它只是使匹配发生了两次。)
那么,让我们看看上面对于名称为 “refs/pull/34/head” 和 “refs/heads/pr/34” 的 ref 名称意味着什么,这两个名称都存在于名为 “origin”(在 github 上)的远程仓库中。
对于 “refs/pull/34/head”:这仅匹配第一个 refspec。 “*” 部分匹配 “34”。该 refspec 的右侧指定将其重写为 “refs/remotes/origin/pr/*”,因此结果为:
refs/remotes/origin/pr/34
现在让我们来处理
refs/heads/pr/34
。它不匹配第一个refspec,但匹配第二个。
*
部分匹配
pr/34
。该refspec的右侧指示将其重写为
refs/remotes/origin/*
,因此结果是:
refs/remotes/origin/pr/34
请注意,在你的本地仓库中,
origin
上的两个不同名称已映射到同一个最终名称。Git 不知道将本地的
refs/remotes/origin/pr/34
设置为第一个还是第二个名称。
要解决错误,您必须完全放弃不需要的 "额外" 匹配,或更改重写规则,使得两个不同的远程
refs/whatever
变成两个不同的本地
refs/remotes/origin/whatever
。这意味着您需要更改 git 配置文件中的
fetch =
行。
我不知道您想要什么结果,所以无法告诉您如何重写它们。(而且,我不知道最初是什么创建了这些内容 - 正常的
git clone
只会创建一个
+refs/heads/*:refs/remotes/origin/*
条目。其他东西添加了多余的条目和
refs/pull/*/head
的条目。正是这些导致了问题。另外,某个东西在github上创建了
refs/heads/pr/34
。)
git config --get-all remotes.origin.fetch
会打印什么? - torekremote.origin.fetch
(这里的remote是单数)。我的想法是可能有两行将同一个远程引用映射到两个不同的本地引用。 - torek