22

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

さて、それで直りましたが、そもそも問題の原因は何でしたか? オリジン/マスターが突然破損したのはなぜですか? 私は何をしました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必要がありますが、理由がわかりません。また、私だけがこの問題を抱えているわけではありません。

4

5 に答える 5

4

refs内にツリーの余分なコピーがあるようですrefs/remotes/originrefs/remotes/origin内に追加のrefsディレクトリがあることに注意してください。これがどうやってそこにたどり着いたのかはわかりませんが、おそらくそれが問題の原因です。Git が ref の省略形を処理する方法 ( のような接尾辞のみを使用して接頭辞を削除できるようにするorigin/master) が原因で、 と の両方があると混乱する可能性がrefs/remotes/origin/masterありrefs/remotes/refs/remotes/origin/masterます。

どのようにしてこの状態になったのかはわかりません。おそらく Git ツールのバグか、ある時点でのタイプミスの可能性があります。この重複ブランチを追跡していたリモート ブランチを削除することで、問題の半分を修正しました。ディレクトリgit pushを削除すれば、問題の残りの半分を修正して、もう一度修正できると確信しています。refs/remotes/origin/refs

于 2012-11-16T11:26:35.233 に答える
0

この git old patch (2007!)で説明されている内容に従ってください。

たとえば、forkee がリベースし、fork が必要とするいくつかのオブジェクトを失った場合など、一部の参照は古くなります。
これらの参照を処理する手っ取り早い方法は、それらを削除して再度プッシュすることです。

ただし、git-push最初に ref の現在のコミット名をフェッチし、ref が有効なオブジェクトを指していないため null sha1 を受け取り、次にreceive-packこのコミット名を持つ ref を削除する必要があることを伝えます。
delete_ref()その後呼び出され、resolve_ref()(オブジェクトの有効性をチェックしない) 同じコミット名を返すことを確認します。これは失敗します。

refs/heads/refs/heads/master「refs/heads/master」という不適切な名前のブランチのように見え (階層ブランチ名を定義するために名前空間を使用)、何も指していません。
それを削除したのは正しい動きでした。

于 2012-11-15T08:00:21.193 に答える