4

と呼ばれるリモートブランチを削除できませんorigin/featureBranch。ブランチ名がで始まるためだと思いoriginますが、よくわかりません。

$ git branch -r | grep featureBranch
  origin/origin/featureBranch

$ git push origin :origin/featureBranch

    error: unable to push to unqualified destination: origin/featureBranch

    The destination refspec neither matches an existing ref on the remote nor
    begins with refs/, and we are unable to guess a prefix based on the source ref.

    error: failed to push some refs to 'git@github.com:myCompany/my-repo.git'

アップデート

$ git push origin :featureBranch同じエラーが発生します。

ノート

リモートブランチではorigin/origin/myFeature、ローカルではorigin/myFeatureです。

私はorigin通常何を意味するのか知っていますが、私の場合、これはブランチの名前の一部です。

Githubはこのブランチを認識しません。


「舞台裏」で何が起こっているのか、どうすればこのブランチを削除できるのか、誰かに説明してもらえますか?

4

4 に答える 4

11

これを試して:

git push origin :refs/heads/origin/featureBranch

ブランチは、の下の技術名でいつでも参照できますrefs/heads/

ブランチは、の下に小さなテキストファイルとして保存されます.git/refs/。ローカルブランチはの下.git/refs/heads/にあり、リモートブランチはの下にあり.git/refs/remotes/<remotename>/ます。したがって、のような単純なブランチmasterはとで見つかりますが.git/refs/heads/master.git/refs/remotes/origin/masterバグのあるブランチは実際にはの下にあり.git/refs/heads/origin/featureBranchます。originリポジトリのリモートブランチと混同されることはありません。これは、の下refs/remotes/origin/ではなく、の下にあるためrefs/heads/です。

リモートサーバーでは、origin/featureBranchブランチはサーバーに対してローカルであるため、の下に保存されrefs/heads/ます。特定のブランチにプッシュするときは、名前またはパスのいずれかで識別できるため、名前が機能しない場合は、。で始まるフルパスを使用してrefsください。

どのようにしてこの奇妙なブランチ名にたどり着きましたか?何をしたのかわからないのでわかりませんが、リモートを含むgit push --mirrorすべての参照をプッシュするので、ローカルブランチとしてを作成するという同じ問題が発生しました。origin/branchname

于 2012-08-30T08:35:18.223 に答える
2

これは機能するはずです:

$ git push origin :featureBranch

プッシュする場所はすでに指定されていますが、これorigin/はローカルブランチの名前にすぎません。

背景:gitがフェッチを実行すると、いわゆる「リモートトラッキングブランチ」が作成されます。これらは実際には自分のブランチと違いはなく、単にリモート名(origin / masterなど)のプレフィックスが付けられ、サーバーブランチをローカルで表します(すべてのコミットはすでにフェッチされています)。

プッシュオリジンを実行するときは、ローカルのリモートトラッキングブランチをまったく参照していませんが、Gitに「プッシュトゥオリジンsourcebranch:targetbranch」と伝えます。

于 2012-08-30T08:21:09.020 に答える
1

メッセージのこのビットは、一致するブランチが見つからないことを示しています。

The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.

ブランチを2回削除しようとすると、これが得られます。(最初は成功し、2番目は失敗します)。または、ブランチが他の誰かによって削除された場合。あなたはgit remote pruneそれがあなたのgit branch -r出力から消えるかどうか試してみることができます。ブランチがorigin使用中であることを確認することもできgit ls-remote git@github.com:myCompany/my-repo.gitます。

origin/masterのように奇妙な(ひどい?)名前の付いたブランチを削除originすると、私にとってはうまくいきます:

$ git push origin master:origin/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../bare/
 * [new branch]      master -> origin/master

$ git branch -r
  origin/origin/master

$ git push origin :origin/master
To ../bare/
 - [deleted]         origin/master
于 2012-08-30T08:34:04.730 に答える
0

単にoriginコロンの後ろにドロップします:

git push origin :featureBranch

Michaelが説明するように、それは指定されたブランチに「何も」プッシュしないことを意味します。 これがより完全な説明です。

于 2012-08-30T08:21:08.610 に答える