Gitから無効なリモートブランチ参照を削除するにはどうすればよいですか?


731

私の現在のリポジトリには次の出力があります:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

remotes/public/masterブランチリストから削除したい:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

また、がgit remoteリストされていないため、の出力は奇妙publicです。

$ git remote show 
origin

ブランチリストから「remotes / public / master」を削除するにはどうすればよいですか?

更新、git pushコマンドを試してみました:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
あなたのシナリオではうまくいきましたgit remote prune [remote-name]git fetch -p [remote-name]?でそれを行うことgit gcは、通常必要とされるよりもはるかに強力です。
rjmunro

6
git remote prune [remote-name]git svnでは機能しませんが、git gc...でもgit branch -rd origin/name機能しません。@Casey、おそらく2番目の答えを選択する必要があります-少し危険が少なくなります。
naught101

4
この質問が大好きです。ほぼ毎月戻ってくる
幸運な人2015年

関連、重複ターゲットでない場合:ローカルとリモートの両方でGitブランチを削除します

2
将来的にn00b gitterエラーを回避するために、master特にリモートで削除する場合は... 以外のサンプルブランチを使用することをお勧めします。
absynce 2016

回答:


743

クリーンアップが必要な場合があります。

git gc --prune=now

または、プルーンが必要になる場合があります。

git remote prune public

プルーン

<name>の下の古い追跡ブランチをすべて削除します。これらの古いブランチは、<name>によって参照されるリモートリポジトリからすでに削除されていますが、 "remotes / <name>"でローカルに使用できます。

--dry-runオプションを使用すると、枝刈りされるブランチを報告しますが、実際には枝刈りしません。

ただし、これらは以前にクリーンアップされているはずです

git remote rm public 

rm

<name>という名前のリモートを削除します。すべてのリモート追跡ブランチとリモートの構成設定が削除されます。

そのため、構成ファイルを手動で編集したが、これが発生しなかったか、特権の問題が発生している可能性があります。

多分それをもう一度実行して何が起こるか見てください。


アドバイスコンテキスト

リビジョンログを見ると、何らかの理由でリポジトリでの作業を望まない、より「正しい」手法を提案したことがわかります。

私は、OPがツリーを一貫性のない状態にして何かがおかしな動作をするようgit gcなことをしたため、残された残骸を修正する必要があったと思います。

通常、 git branch -rd origin/badbranchローカルのトラッキングブランチをニューキングのため、あるいは十分なgit push origin :badbranchリモートブランチをニューキングのための、そして通常は、あなたがなり決して呼び出す必要がありませんgit gc


4
リモート側のブランチを削除したくない。微妙な違いがあると思います。
cmcginty 2009

2
えーと、問題は「リモートブランチを削除するにはどうすればよいか」を効果的に尋ねることです。それはそれらのパスが何であるかです。
ケントフレドリック

1
それが私が求めていることをより明確にするならば、私は主題を言い換えますが、コマンドは私の問題が何であるかを正確に示します。
cmcginty 2009

40
git gcここでは必要ありませんが、gitがどのリモートブランチが実行されるかを確認しているので、git remote prune手動で削除するよりも安全ですgit branch -rd
Mike Seplowitz、2011年

3
これは私にとってはうまくいきませんでした-しかし 'gitブランチ-rd'はうまくいきました。
dsummersl

683

あなたがする必要があるのは

git fetch -p

リモートで削除されたすべてのローカルブランチが削除されます。

git 1.8.5以降を使用している場合は、これを自動的に設定できます

git config fetch.prune true

または

git config --global fetch.prune true

7
これも私が探していたものです-問題は、一般的なシナリオよりも複雑なシナリオを説明することです。
rjmunro

22
対応するリモートが削除されているローカルブランチを削除する方法を探していますが、これは私にとっては機能しません。なぜか?
jackocnr 2013年

11
これにより、remote / originにリストされているブランチは削除されますが、ローカルトラッキングブランチは削除されません。これは同じくらい重要です。
BlueRaja-ダニープフルフフト

@Cupcake最初の編集をロールバックしなかったため(Git 1.8.5+に関する誤った情報が修正されていました)、これで正しくありません。私の2番目の編集は、私が入れたものを間違っていたものを修正することでした。元に戻すには、編集をもう1つロールバックしてください。ありがとう。
ferventcoder、2014

@ferventcoder私はあなたの最後の編集をダブルチェックし、それに戻しました。OPが気に入らなければ、OPは再びロールバックできます。ありがとう。

319
git push public :master

これによりmaster、Kent Fredricが指摘した名前のリモートブランチが削除されます。

リモート追跡ブランチを一覧表示するには:

git branch -r

リモート追跡ブランチを削除するには:

git branch -rd public/master

6
これはgit-svnリモートゴーストブランチを削除するのに役立ちました。
Nick

9
git branch -rd removed_remote/branchgit gc --prune=nowは役に立たなかったが、私のために働いた。
シャンポンリエ

2
私はgit prune問題なく使用できましたが、メインリポジトリを分岐した同僚は、** git branch -rd public/masterスタイルのソリューションを使用して環境をクリーンアップします。
Abel

3
git branch -rd public/master私が欠けていたものでした。私が持っていたheroku/masterherkou/masterwoops笑...
アーロン

@rchampourlier 100%の価値がない-gitリポジトリが大きい場合、未使用のブランチを削除すると、状況によっては多くのディスク領域が解放される可能性があります。
peterh-モニカを2017年

159

あなたがする必要があるのは

$ git branch -rd origin/whatever 

とても簡単です。ここでgcを呼び出す理由はありません。


1
削除したものをgithubに「プッシュ」するにはどうすればよいですか?
Thufir 2012

14
@Thufirそれはこの質問が言っていたものではありません。この質問は、ローカルリポジトリに無効なリモート参照があるが、そのブランチがリモートサーバーに存在しない場合に特に当てはまります。あなたの質問への答えは$ git push origin:whatever
jpswain

はい、ブランチが削除されたリモートリポジトリで何かが発生しても、ローカルマシン上のそのリモートブランチへの参照がまだある場合は、クリーンアップするために元の回答に入力したことを実行する必要があります。
jpswain 2012

6
大きなクリーンアップジョブ(多数のダングリングリモート)がgit branch -rd $(git branch -r)ある場合、フェッチを実行して有効なブランチを再確立するなどの方法ですべてのリモートブランチを削除することができます。
nobar 2012

私の状況はgit config -e、リモコンの名前を変更するために使用していたということでした。リモコンの名前をに変更しmineましたorigin。その後、これが私のために最善を働いたソリューションでした:git branch -rd $(git branch -r | grep 'mine/')
スティーブン・呂

70

git gc --prune=now あなたが望むものではありません。

git remote prune public

またはgit remote prune origin#リモートソースの場合

あなたが欲しいものです


6
@Casey $ git gc#はリポジトリを高速化するgitファイルのデフラグのようなものです$ git remote prune origin#は "git branch -r | grep origin"で表示される古いリモートブランチの削除をクリーンアップします。それが私が信じている質問の質問です。したがって、コマンドはまったく異なります。
2010

29

参照が詰め込まれたとき、受け入れられた答えは私にとってはうまくいきませんでした。ただし、これは次のことを行います。

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

私のために働いた。通常のgitブランチ-dが機能せず、誤って作成された "original"と呼ばれるオリジンを.git / configファイルに直接削除したため、ブランチが存在しないというエラーが返されました。
micrub

これは、.git / configから誤って省略されたブランチを削除するために使用しなければならなかった方法です(無関係な破損のために再構築する必要がありました)。この答えがあまりにも悪いので、最終的に解決策を見つけて受け入れられた回答に追加するまで、気づかなかったほどチェーンの下流にありました。
taranaki 2016

これは、svn2gitを使用した後に必要なものです。remotes / svn / *ブランチがたくさんありました。最初に偽の「svn」リモートを作成する必要がありました。
Sam

7

私の場合、に保存されたエントリを削除しようとしました.git/packed-refs。このプレーンテキストファイルを編集して、git br -D触れる方法がわからないエントリを削除できます(少なくともバージョン1.7.9.5)。

私はこの解決策をここに見つけました:https : //stackoverflow.com/a/11050880/1695680


うわー、これは私を助けました。私の同僚はVSを再起動し、コンピューターを再起動しましたが、何も機能しませんでした。ローカルリポジトリを削除し、これを取り除くためにすべてをプルしました:)
Esen

1
今日、私はこのpacked-refsファイルがの一部として作成されgit gcていることを確認しました。コミットを高度に圧縮されたアーカイブにパックすると、最適化のために参照が単一のプレーンテキストファイルに移動されました。gitの将来のバージョンで参照をgit br -D ...パックできることを願っています。
ThorSummoner


3

については知らなかったgit branch -rdので、このような問題を自分で解決する方法は、自分のリポジトリをリモートリポジトリとして扱い、リモートで削除することです。git push . :refs/remotes/public/master。他の方法が機能せず、あなたが取り除きたい奇妙な参照がある場合、この生の方法は確実です。あらゆる種類の参照を削除(または作成)するための正確な精度を提供します。


2

ほんの少し関連していますが、同じ状況で役立つ可能性があります-リモートリポジトリにネットワークファイル共有を使用します。先週問題はありませんでしたが、今週は「リモートのオリジンがブランチの参照/ヘッド/マスターの参照をアドバタイズしませんでした。この参照はリモートに存在しないか、権限設定によって非表示になっている可能性があります」というエラーが発生しました

しかし、私たちは物事を汚すために何もされていないと信じていました。NFSはスナップショットを行うので、各「以前のバージョン」を確認しました。3日前に、リポジトリのMB単位のサイズが282MBから33MBになり、約1,403個の新しいファイルと300個のフォルダーが存在するようになりました。同僚に問い合わせたところ、1人がその日にプッシュを試みたがキャンセルされた。

私は、NFSの「復元」機能を使用して、その日付の直前に復元し、すべてが正常に機能するようになりました。以前にプルーンを試しましたが、役に立たなかったようです。たぶん、より厳しいクリーンアップはうまくいったでしょう。

これが誰か他の人を助けるかもしれないことを願っています!

ジェイ


2

同様の問題がありました。答えのどれも役に立たなかった。私の場合、削除された2つのリモートリポジトリが永久に表示されていました。

私の最後のアイデアはそれへのすべての参照を手動で削除することでした。

リポジトリが「Repo」と呼ばれているとしましょう。やった:

find .git -name Repo 

そこで、対応するファイルとディレクトリを.gitフォルダーから削除しました(このフォルダーは、Railsアプリまたはコンピューター https://stackoverflow.com/a/19538763/6638513にあります)。

それから私はしました:

grep Repo -r .git

これにより、対応する行を削除したテキストファイルが見つかりました。今、すべてがうまくいくようです。

通常、このジョブはgitに任せます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.