Git 1.8:it push 错误:dst ref refs/heads/master 接收了来自多个 src 的内容。

24

Git 1.8存在另一个问题:

$ git push
error: dst ref refs/heads/master receives from more than one src.
error: failed to push some refs to 'gitosis@xxx.xx:xxx.git'

有什么建议吗?在升级到1.8之前它是可以工作的。

$ git remote -v
origin  gitosis@xxx.xx:xxx.git (fetch)
origin  gitosis@xxx.xx:xxx.git (push)

在谷歌上搜索了一番后,我首先尝试了这个:

$ git push origin :refs/heads/refs/heads/master
remote: warning: Allowing deletion of corrupt ref.
To gitosis@xxx.xx:xxx.git
 - [deleted]         refs/heads/master

我不知道那是什么,也不知道为什么它已经损坏了。

$ git pull
Already up-to-date.

$ git push
error: dst ref refs/heads/master receives from more than one src.
error: failed to push some refs to 'gitosis@xxx.xx:xxx.git'

仍然无法工作,但是至少origin master可以工作:

$ git push origin master
Counting objects: 42, done.
To gitosis@xxx.xx:xxx.git
3e3fc87..6e11d2a  master -> master

好的,那样有点解决了,但问题最初是什么原因导致的呢?为什么 origin/master 突然出现问题?我用 git push origin :refs/heads/refs/heads/master 做了什么?

.git/config:

[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = gitosis@xxx.xx:xx.git
push = HEAD
[branch "master"]
remote = origin
merge = refs/heads/master

ls .git/refs/remotes/origin:

HEAD    master  refs
最终,现在每次我都要执行git push origin master。最烦人的是有些库可以使用git push,但在大多数库中我必须添加origin master,但我不明白为什么,这不可能只是我一个人遇到的问题。

你能展示一下.git/config 中的 [remote "origin"][branch "master"] 部分吗? 同时也需要提供 ls .git/refs/remotes/origin - Brian Campbell
给你,不过这是在我“修复”后的结果。 - firedev
我也遇到了同样的问题,但我从未在任何地方(包括.git/ 和服务器端)看到过refs/heads/。像建议我的那样,在全局配置中确实有这些内容:push.default=matching, remote.origin.push=HEAD. - mirabilos
5个回答

30

如果您意外地输入正在尝试推送的分支名称两次,也会出现此错误,例如:

git push master otherBranch master moreBranches

产生了这个错误。一旦你意识到自己做错了,问题就很容易解决:

git push master otherBranch moreBranches

5

在我的情况下,分支名称中有一个空格:

git push origin 353-applyPermissions :353-applyPermissions

返回值>错误:dst引用refs/heads/353-applyPermissions接收自多个src,但以下内容有效:

git push origin 353-applyPermissions:353-applyPermissions

4
看起来你在refs/remotes/origin目录下有一个额外的refs树。你注意到了,refs/remotes/origin目录下多了一个refs目录?我不知道怎么会出现这种情况,但很可能导致了你的问题。由于Git处理引用缩写的方式(允许你省略前缀,仅使用后缀,如origin/master),因此它可能会因为同时存在refs/remotes/origin/masterrefs/remotes/refs/remotes/origin/master而感到困惑。
我不知道它是怎么处于这种状态的;可能是Git工具中的一个bug,也可能是你在某个时候输入错误。通过删除跟踪该重复分支的远程分支,你已经解决了一半的问题。如果你删除refs/remotes/origin/refs目录,我敢打赌你可以解决剩下的问题,并再次进行git push

现在我已经做了一些更改,但我又遇到了同样的问题。 - firedev
@Nick,你做了哪些更改?你是否像我提到的那样删除了.git/refs/remotes/origin/refs?请记住,您需要对其执行rm -r,因为它是一个目录,您想要删除所有子目录。 - Brian Campbell
我的意思是我已经改了一些代码并想要推送。即使使用 rm -r 命令也无法帮助,但我可以通过 git 的 push origin master 命令来推送:$ rm -r .git/refs/remotes/origin/refs/ $ git push error: dst ref refs/heads/master receives from more than one src. error: failed to push some refs to 'gitosis@xxx.xx:xx.git' - firedev

0
在我的情况下,我有一个与分支名称相同的标签。重命名分支名称就可以解决问题了。

0

根据 这个 git 老补丁(2007年!)中所解释的内容:

有些引用会过期,例如当被 fork 的版本进行了 rebase 并丢失了一些 fork 所需的对象时。
处理这些引用的快速而粗暴的方法是删除它们并再次推送。

然而,git-push 首先会为该引用获取当前提交名称,由于该引用不指向有效对象,因此将收到空 sha1,然后告诉 receive-pack 应该使用此提交名称删除该引用。
随后会调用 delete_ref(),并检查 resolve_ref()(不检查对象的有效性)返回相同的提交名称。这将失败。

refs/heads/refs/heads/master 看起来像一个错误命名为“refs/heads/master”的分支(使用 定义分层分支名称的命名空间),并且指向了空值。
删除它是正确的操作。


我不明白 - 我可能有几个分支,但我只是提交到自己的存储库,在项目中独自工作。这是某种1.8过渡错误吗? - firedev
@Nick,不,我想这更多是远程仓库中的错误状态,你拉取了它,并引入了错误的分支名称“refs/heads/master”。因此,在下一次推送时出现了问题。 - VonC
几天后我做了一些更改,但我无法再次推送。 - firedev

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