Git 1.8:它推送错误:dst ref refs / heads / master从多个src接收

时间:2012-11-14 05:32:11

标签: git

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但我不明白为什么,而且我不能单独拥有这个问题。

5 个答案:

答案 0 :(得分:17)

获得此错误的另一种方法是,如果您不小心输入了要尝试推送两次的分支的名称,即:

git push master otherBranch master moreBranches

产生此错误。一旦你意识到你已经完成修复就很明显了:

git push master otherBranch moreBranches

答案 1 :(得分:2)

您似乎在refs内有refs/remotes/origin树的额外副本。请注意,在refs/remotes/origin内,您是否有额外的refs目录?我不知道这是怎么到达的,但这可能是导致你出现问题的原因。由于Git处理refs缩写的方式(允许你删除前缀,只使用像origin/master这样的后缀),可能会因为refs/remotes/origin/masterrefs/remotes/refs/remotes/origin/master而感到困惑。 / p>

我不知道它是如何进入这种状态的;可能是Git工具中的一个错误,可能是你在某些时候做的错字。您通过删除跟踪此重复分支的远程分支来解决问题的一半。如果你删除git push目录,我愿意打赌你可以解决问题的另一半,并且能够再次refs/remotes/origin/refs

答案 2 :(得分:1)

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

git push origin 353-applyPermissions :353-applyPermissions

返回>错误:dst ref refs / heads / 353-applyPermissions从多个src接收。 但这是可行的:

git push origin 353-applyPermissions:353-applyPermissions

答案 3 :(得分:0)

遵循this git old patch(2007!)

中的解释
  

有些裁判陈旧,例如当forkee重新装配并丢失叉子所需的一些物品时   快速&处理这些引用的脏方法是删除它们并再次推送它们。

     

但是,git-push首先会获取ref的当前提交名称,因为ref没有指向有效对象,所以会收到null sha1,然后告诉receive-pack它应该删除ref使用此提交名称   随后将调用delete_ref(),并检查resolve_ref()检查对象的有效性)是否返回相同的提交名称。哪个会失败。

refs/heads/refs/heads/master看起来像一个不正确地命名为“refs / heads / master”的分支(使用defining hierachical branch name的命名空间),并且指向任何内容。
删除它是正确的举措。

答案 4 :(得分:0)

在我的情况下,我有一个与分支名称同名的标签。重命名分支名称并起作用。