Gitから古いリモートブランチを削除します


80

Gitでbashオートコンプリートを使用すると、もう持っていない古いリモコンのブランチが表示され続けます。私がgit branch -laそれをするとき、それはそれらの古いリモコンと枝を示しますが、そうではありgit branch -lません。Als .git/refs/remotes/もそれらを示しています。ただし、それらは私の.git / configには存在せず、実行時にも表示されませんgit remote show

オートコンプリートリストが現在長すぎるため、どうすればそれらを取り除くことができますか。

私はすでに試しました:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

また、リポジトリのクローンを再作成できることも認識していますが、それは不正行為です;-)


注:git remote rm現在(git 2.0.1、2014年6月)、最初にリモートトラッキングブランチを削除します。これは、古いブランチのクリーンアップを回避するのに役立ちます。以下の私の答えを
VonC 2014


これが私の別の答えです:stackoverflow.com/a/44129766/3835843
Arif

回答:


142

ブランチがリモートリポジトリで削除された場合、Gitは(ローカル)リモートトラッキングブランチを自動的に削除しません。さらに、V2.0.1より前のリモート追跡ブランチは、git構成からリモートを削除したときに削除されない場合がありました(VonCの回答を参照)。

リモートリポジトリの1つで古いリモート追跡ブランチ(リモートリポジトリで削除されたブランチ)を削除するには、次のコマンドを実行します。

git remote prune <remote>

マニュアルページを引用するには、またはgit remote

プルーン

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

--dry-runオプションを使用して、どのブランチがプルーニングされるかを報告しますが、実際にはそれらをプルーニングしません。

ただし、質問から、手動で削除したようです.git/refs/remotes/theoldremote。そのため、Gitは、リモート追跡ブランチが属していたリモートリポジトリについて認識しなくなりました。それはあなたがそれをすることになっている方法ではありません。

リモートリポジトリを削除する通常の方法は、実行することです

git remote rm <remote>

これにより、リモートがから.git/config削除され、リモート追跡ブランチが削除されます。

下のディレクトリを削除する.git/refs/remotes/と、ブランチは残ります。次に、それらを手動で削除する必要があります。

git branch -rd <remote>/<branchname>

-rリモートブランチを削除するオプションが必要です。


2
いいえ、そうではありません。それは言うfatal: 'kolichikov' does not appear to be a git repository
アレックス

2
フェッチ/プルでのリモートブランチの自動プルーニングについては、stackoverflow.com
a / 18718936/968201

これが遅い場合は、これが修正されている新しいGit(2.0.1+ IIRC)にアップグレードしてください(100倍以上高速)。
odinho - Velmont

ユーザーのプルーニングに関する注意:Gitのドキュメントには、「ほとんどの場合、ユーザーはgit gcgitpruneを呼び出すを実行する必要があります。」と記載されています。ただし、はとgit gc互換性がないことに注意してください--dry-run
JYL 2017年

git branch -rd <remote>/<branchname>私が探していたものでした。ありがとうございました!
アントワーヌコルソン

16

私が使う

git push origin :remote_branch

サーバーからブランチを削除します。

git remote prune origin

サーバーに存在しなくなったリモート参照を削除します


いいえ、そうではありません。それは言うfatal: 'kolichikov' does not appear to be a git repository
アレックス

1
アレックスは、あなたが...いないあなたのホームフォルダ内のリポジトリフォルダ内のコマンドを実行する必要があります
スパーク

6

注:git remote pruneが答えですが、git 2.0.1(2014年6月25日)以降、git remote rm はリモート追跡ブランチを削除することから始まります
したがって、うまくいけば、の後に古いブランチをクリーンアップする必要はありませんgit remote rm

JensLindströmによるcommitb07bdd3を参照してくださいjensl

remote rm:最後にリモート構成を削除します

リモートを削除するときは、リモート構成を削除する前に、リモート追跡ブランチを削除してください。
このようにして、リモートトラッキングブランチの削除中に操作が失敗または中止された場合、コマンドを再実行して操作を完了することができます


ただし、必要に応じて、git fetch最初に設定した場合は、単純なもので十分です。

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true


4

ブランチに何もプッシュして削除しません

git push remote :remote_branch

それはドキュメントのどこかにありますが、それは本当に明白ではありません。

それとも私はあなたの質問を誤解しましたか?


2
「それはドキュメントのどこかにありますが、それは本当に明白ではありません。」そのようなものですgit
mnagel 2013

「リモート」とは、リモートリポジトリ名を意味します。「原点」など。しかし、私はあなたが単にリモートブランチを削除する以外の何かを意味していると思い始めています。
aragaer 2013

このような何か他のもの:stackoverflow.com/questions/1072171/...
aragaer

4

わかりました。問題は、リモートがもう存在しないことでしたが、それらはgitデータベースのどこかに存在します。リモートを再度追加してから、

git remote prune theremote
git remote rm theremote
git gc --prune=now

その後、それらはリストから消えます。どういうわけか私は推測する前にそれらを正しく削除しませんでした。


私はたくさんのソースからすべてを試しましたが、うまくいったのは、問題をリモートで再度追加してから削除することだけでした。ありがとう!
jc00ke 2017

0

実行したときにサーバー側で削除されたリモートブランチがまだ表示されていると、混乱していました。

$ git branch --all

次のコマンドでこれを修正しました(gitバージョン2.25.0)。

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