git remote prune –期待したほど枝刈りされたブランチが表示されませんでした


113

manページから:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

だから私は使用して枝の束を削除しました

git push origin :staleStuff

そして走った

git remote prune origin

ただし、剪定されたローカルブランチは1つだけでした。これらのブランチの一部は、私が作成したものもあれば、同僚が作成したものもあります。これは、最初にそれらのブランチを正しく追跡していなかったことを示していますか?


7
削除されるブランチを見つけるにはgit remote show origin、次のようにして、マークされたブランチを探しますstale
Someone Somewhere

回答:


189

を使用するとgit push origin :staleStuff、が自動的に削除されるorigin/staleStuffため、実行すると、git remote prune origin他のユーザーによって削除されたブランチが枝刈りされています。git prune削除したブランチを取り除くために、同僚が実行する必要がある可能性が高くなります。


では、正確にgit remote pruneは何をするのでしょうか?主なアイデア:ローカルブランチ(トラッキングブランチではない)はgit remote pruneコマンドで操作されないため、手動で削除する必要があります。

理解を深めるための実際の例:

との2つのブランチを持つリモートリポジトリがmasterありfeatureます。両方のブランチで作業しているとしましょう。その結果、ローカルリポジトリにこれらの参照があります(混乱を避けるために完全な参照名が付けられています)。

  • refs/heads/master(略称master
  • refs/heads/feature(略称feature
  • refs/remotes/origin/master(略称origin/master
  • refs/remotes/origin/feature(略称origin/feature

さて、典型的なシナリオ:

  1. 他の開発者がですべての作業を完了しfeature、それをマージしてmasterfeatureリモートリポジトリからブランチを削除します。
  2. デフォルトでは、git fetch(またはgit pull)を実行しても、参照はローカルリポジトリから削除されないため、これら4つの参照はすべて保持されます。
  3. それらをクリーンアップして、を実行することにしましたgit remote prune origin
  4. gitはfeatureブランチが存在しないことを検出したためrefs/remotes/origin/feature古いブランチも削除する必要があります。
  5. これで、は参照を削除しないrefs/heads/featureため、を含む3つの参照git remote pruneがありrefs/heads/*ます。

リモートトラッキングブランチに関連付けられているローカルブランチは、branch.<branch_name>.merge構成パラメーターによって識別できます。このパラメータはgit pull、(おそらくを除いて)機能するために実際には必要ないため、存在しない可能性があります。

(例とコメントからの役立つ情報で更新)


私は状況を理解しました:ブランチはまだローカルに存在していますが、リモートリポジトリから削除されています。ここで、リモートに存在しないすべてのローカルブランチを削除したいので、git pruneを実行します。「これらの古いブランチはすでにリモートリポジトリから削除されています」と私は言っています。私が間違っている?
Felixyz

3
あなたは正しいですが、の場合の「地方支部」の意味を誤解しているかもしれませんgit prune。枝だけが/refs/remotes/<remote_name>/剪定の対象になります。のブランチは変更/refs/heads/されません-これらは手動で管理する必要があります。
最大

ああ、そう思ったんです。したがって、私がやりたいことはできません。リモートブランチが削除されているかどうかをチェックすることにより、リモートブランチを追跡しているヘッド内のすべてのブランチを自動的に削除しますか?
Felixyz

2
そのための組み込みコマンドはありませんが、そのようなスクリプトを自分で書くことができます。追跡ブランチは、branch.<branch_name>.mergeconfigパラメータの存在によって識別できます。
最大

コメントの情報を回答自体に追加すると、@ Felixyzと同じ誤解を持っているすべての人があなたの回答を面白く見て、コメントを読んで最終的に理解を得る必要がないように、この回答の方が良いでしょう。
Akrikos 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.