Wie man lokale Nachverfolgungszweige, die nicht auf dem Remote vorhanden sind, beschneidet
Mit git remote prune origin
ich kann entfernen Sie die lokalen Niederlassungen, die nicht auf der Fernbedienung nicht mehr.
Möchte ich aber auch entfernen von lokalen Niederlassungen, die erstellt wurden, von denen remote-Niederlassungen (a überprüfen, ob Sie individueller wäre schön).
Wie kann ich dies tun?
InformationsquelleAutor der Frage Alex | 2012-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem beschneiden, können Sie die Liste der remote-Niederlassungen mit
git branch -r
. Die Liste der Filialen mit Ihrer remote-tracking-branch können abgerufen werden, mitgit branch -vv
. Also mit diesen beiden Listen finden Sie die remote-tracking-branches, die nicht in der Liste der Fernbedienungen.Diese Zeile sollte den trick tun (erfordert
bash
oderzsh
funktioniert nicht mit standard-Bourne-shell):git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
Diese Zeichenfolge wird in der Liste der remote-Niederlassungen und übergibt es in
egrep
durch die standard-Eingabe. Und Filter, die Zweige, die über eine remote-tracking-branch (mitgit branch -vv
und-Filterung für diejenigen, dieorigin
) dann immer die erste Spalte der Ausgabe, welche die Zweigniederlassung Namen. Schließlich passieren alle Markenbezeichnungen, die in der delete-branch-Befehl.Da ist es mit der
-d
option, es nicht zu löschen äste, die nicht in den Zweig übertragen wurde, dass Sie, wenn Sie diesen Befehl ausführen.Denken Sie auch daran, dass Sie benötigen, um ausführen
git fetch --prune
erstensonstgit branch -r
werden noch sehen, die remote-Niederlassungen.InformationsquelleAutor der Antwort Schleis
Wenn Sie möchten, löschen Sie alle lokalen Zweige, die sind schon zusammengeführt, Meister, können Sie folgenden Befehl verwenden:
Mehr info.
InformationsquelleAutor der Antwort jackocnr
Inmitten der präsentierten Informationen durch
git help fetch
es ist dieses kleine item:So, vielleicht
git fetch -p
ist das, was du suchst?EDIT: Ok, für diejenigen, die immer noch diskutiert, diese Antwort zu 3 Jahre nach der Tat, hier ist ein wenig mehr Informationen, warum ich diese Antwort...
Erste, der OP sagt, Sie wollen "entfernen Sie auch diese lokalen Niederlassungen, die erstellt wurden, von denen die entfernten Filialen [, die nicht mehr auf die remote]". Ist dies nicht eindeutig möglich, in
git
. Hier ist ein Beispiel.Sagen wir, ich habe ein repo auf einem zentralen server, und es hat zwei Niederlassungen, genannt
A
undB
. Wenn ich clone das repo auf meinem lokalen system, mein Klon lokalen refs (nicht die tatsächlichen Zweige noch) genanntorigin/A
undorigin/B
. Lassen Sie uns jetzt sagen, dass ich Folgendes tun:Sind die einschlägigen Fakten hier sind, dass ich aus irgendeinem Grund wählte das erstellen einer branch auf meinem lokalen repo, die einen anderen Namen als seiner Herkunft, und ich habe auch eine lokale Niederlassung, die (noch) nicht vorhanden ist, auf die Herkunft repo.
Lassen Sie uns jetzt sagen, dass ich entfernen sowohl die
A
undB
äste auf dem remote-repo-update meinem lokalen repo (git fetch
irgendeiner form), die bewirkt, dass mein local refsorigin/A
undorigin/B
zu verschwinden. Nun, meine lokalen repo hat drei Zweige nochA
Z
undC
. Keiner von Ihnen haben eine entsprechende branch auf das remote-repo. Zwei von Ihnen waren "erstellt von ... entfernten Niederlassungen", aber auch wenn ich weiß, dass es verwendet, um einen Zweig namensB
auf die Herkunft, habe ich keine Möglichkeit zu wissen, dassZ
wurde erstellt vonB
weil es umbenannt wurde, in den Prozess, wahrscheinlich für einen guten Grund. Also, wirklich, ohne eine externe Prozess-Aufnahme-branch origin Metadaten, oder ein Mensch, kennt die Geschichte, es ist unmöglich zu sagen, welcher der drei Zweige, wenn einer, der OP ist die Zielsetzung für die Entfernung. Ohne einige fremde Informationen, diegit
nicht erhalten automatisch die für Siegit fetch -p
ist in etwa so nah wie Sie bekommen können, und eine automatische Methode für buchstäblich versucht, was der OP gefragt hat, läuft Gefahr, entweder zu löschen, zu viele äste, oder etwas fehlt, dass die OP sonst löschen wollen.Es gibt andere Szenarien, als auch, wie, wenn ich drei separate zweigt
origin/A
testen drei verschiedene Ansätze, um etwas, und dannorigin/A
geht Weg. Jetzt habe ich drei Zweige, die kann natürlich nicht alle mit Namen-Weise, aber Sie wurden erstellt vonorigin/A
und so eine wörtliche Auslegung des OPs-Frage erfordern würde, entfernen Sie alle drei. Jedoch, die möglicherweise nicht wünschenswert sein, wenn Sie könnte sogar finden Sie einen zuverlässigen Weg, um Ihnen passen...InformationsquelleAutor der Antwort twalberg
Dies löscht den lokalen Niederlassungen, für die die remote-tracking branches wurden beschnitten. (Stellen Sie sicher, Sie sind auf
master
Zweig!)Details:
git branch -vv
zeigt "Weg" für die lokalen Niederlassungen, die die remote wurde beschnitten.-d
überprüfen, ob es übertragen wurde (-D
es zu löschen, unabhängig)InformationsquelleAutor der Antwort wisbucky
Kann man konfigurieren Sie Git verwenden, um automatisch entfernen Sie Verweise auf gelöschte remote-Niederlassungen beim abholen:
Beim Aufruf
git fetch
odergit pull
danach werden Verweise auf gelöschte remote-Niederlassungen erhalten Sie automatisch entfernt.InformationsquelleAutor der Antwort wedesoft
Es wird eine Liste der lokalen Zweige, deren remote-tracking branch löschen von remote -
Wenn Sie wollen, de-Verweise auf diese lokalen Niederlassungen von lokalen, die un verfolgt
InformationsquelleAutor der Antwort 027
Es eine ordentliche NPM-Paket, das es für Sie tut (und es sollte funktionieren cross-Plattform).
Installieren es mit:
npm install -g git-removed-branches
Dann
git removed-branches
zeigen Ihnen alle veralteten Filialen undgit removed-branches --prune
um tatsächlich zu löschen.Mehr info hier.
InformationsquelleAutor der Antwort tzachs
Wenn Sie mit Windows und der Powershell, können Sie die folgenden verwenden, so löschen Sie alle lokalen branches zusammengeführt wurden in den branch ausgecheckt:
Erklärung
git
Ausgabe für jeden verbleibenden Zweig-nameLohnt es sich, läuft
git branch --merged
indem sich zunächst nur um sicherzugehen, es geht nur zu entfernen, was Sie es erwarten.(Portiert/automatisiert http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/.)
InformationsquelleAutor der Antwort Gnat
nicht sicher, wie Sie Sie tun es alle auf einmal, aber git
git branch -d <branchname>
löschen einer lokalen Niederlassung NUR, wenn es vollständig zusammengeführt. Hinweis: die Kleinbuchstaben d.git branch -D <branchname>
(beachten Sie die Hauptstadt D) löschen einer lokalen Niederlassung unabhängig von Ihrer zusammengeführt status.InformationsquelleAutor der Antwort NHDaly
Windows-Lösung
Für Microsoft Windows Powershell:
git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Split(" ")[0]} | % {git branch -d $_}
Erklaerung
git checkout master
Schalter, um die master-Zweiggit remote update origin --prune
Pflaumen, Außenstellengit branch -vv
erhält eine ausführliche Ausgabe aller Branchen (git-Referenz)Select-String -Pattern ": gone]"
bekommt nur die Datensätze, in denen Sie entfernt wurden-Fernbedienung.% { $_.toString().Split(" ")[0]}
Holen Sie sich die Zweig-name% {git branch -d $_}
löscht den ZweigInformationsquelleAutor der Antwort chris31389
Sogar noch kürzer und sicherer one-liner:
Werden sicher zur Kasse zu verzweigen, die nicht zusammengeführt werden, noch bevor Sie es ausführen. Da können Sie nicht löschen Zweig, Sie werden derzeit überprüft.
InformationsquelleAutor der Antwort FelikZ
Einer Variante auf @wisbucky Antwort, ich habe Folgendes als alias zu meinem
~/.gitconfig
Datei:Mit dabei, eine einfache
git pruneitgood
reinigt bis sowohl lokale & remote-Zweigstellen, die nicht mehr benötigt werden, nachdem verschmilzt.InformationsquelleAutor der Antwort Ken Williams
Ich wollte etwas, das würde purge alle lokalen Zweige, die waren einen remote-tracking-branch, auf
origin
wo der remote Zweig wurde gelöscht (gone
). Ich wollte nicht löschen, lokalen Zweige, die wurden nie eingerichtet, um track remote branch (d.h.: meiner lokalen dev-Filialen). Außerdem wollte ich eine einfache one-liner, die nur verwendetgit
oder andere einfache CLI-tools, sondern schreiben Sie benutzerdefinierte Skripts. Ich landete mit ein bisschengrep
undawk
zu machen mit diesem einfachen Befehl, dann fügte hinzu, es als alias in meine~/.gitconfig
.Hier ist ein
git config --global ...
Befehl zum einfachen hinzufügen von diesen alsgit prune-branches
:ANMERKUNG: die Verwendung der
-D
Flagge zugit branch
kann sehr gefährlich sein. Also, in der config-Befehl oben benutze ich die-d
optiongit branch
eher als-D
; ich benutze-D
in meine aktuelle config. Ich benutze-D
weil ich nicht wollen, zu hören Git beschweren sich über nicht zusammengeführte Zweige, ich will nur Sie gehen. Möglicherweise möchten Sie diese Funktionalität als gut. Wenn dem so ist, verwenden Sie einfach-D
statt-d
am Ende des config-Befehls.InformationsquelleAutor der Antwort Karl Wilbur
Basierend auf den Antworten kam ich mit dieser Leitung Lösung:
InformationsquelleAutor der Antwort gagarwal
Können Sie diesen Befehl verwenden:
Git Clean: Löschen Sie Bereits Zusammengeführte Zweige einschließlich brechen von Befehl
InformationsquelleAutor der Antwort sendon1982
Schleis " - Variante funktioniert nicht bei mir (Ubuntu 12.04), so lassen Sie mich vorschlagen, meine (klar und glänzend 🙂 Variante (N):
Variante 1 (würde ich bevorzugen):
Variante 2:
ein. Dry-run:
b. Entfernen Sie äste:
InformationsquelleAutor der Antwort daniilyar
Ich haben sich die akzeptierte Antwort in einem robusten Skript. Sie finden es in meinem git-extensions-repository.
InformationsquelleAutor der Antwort Ingo Karkat
Folgenden ist eine Adaption von @wisbucky-Antwort für Windows-Benutzer:
for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d
Benutze ich posh-git und leider PS nicht wie der Nackte
for
so habe ich eine plain 'ol Befehl Skript mit dem Namen PruneOrphanBranches.cmd:Rufen Sie es ohne Parameter, um eine Liste, und dann rufen Sie es mit "-d", um die eigentliche Löschung oder "-D" - für alle Zweige, die nicht vollständig verschmolzen sind, aber die Sie löschen möchten sowieso.
InformationsquelleAutor der Antwort Sam C
Versuchen, diese in der git bash zu Holen und zu beschneiden Verweise auf gelöschte Zweige, und dann beschneiden die lokalen Niederlassungen wurden tracking die entfernt:
Erinnern, an der Kasse zunächst eine Verzweigung, die nicht gelöscht werden, so dass nicht blockiert das löschen des Zweiges.
InformationsquelleAutor der Antwort Guillermo Gutiérrez
Die Powershell-Version
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}
Dies wird entfernen Sie alle lokalen branches zusammengeführt wurden Meister, während Sie auf dem master-branch.
git checkout master
zu wechseln.InformationsquelleAutor der Antwort Kevin George
Löschen jeder Filiale, die nicht auf dem neuesten Stand mit master
InformationsquelleAutor der Antwort Jason Waldrip
wenn Sie das entfernen von Ihrem lokalen computer, hier ist mein direkte Weg:
Gehen Sie einfach auf:
C:\Repo\your-project\.git\refs\heads
Jeder Zweig wird eine Datei erstellt, in diesem Ordner nur die Dateien entfernen, die mit Ihren Zweig-Namen
Es ist schwer zu finden-Methode auf Windows, ich bin mit sourcetree, und die will ich nicht löschen. Ich finden Sie einfach heraus, auf diese Weise, und es Tat rescue me auf meinem Windows.
InformationsquelleAutor der Antwort Xin
Ich bin mir ziemlich sicher, dass
git remote prune origin
ist, was Sie wollen.Können Sie es als
git remote prune origin --dry-run
um zu sehen, was es würde tun, ohne änderungen vorzunehmen.InformationsquelleAutor der Antwort Jason Antman
Über die GUI? Eine manuelle Prozedur ist, sondern schnell und einfach.
Wählen Sie "Branch -> Löschen". Sie können wählen Sie mehrere Zweige mit gedrückter Strg-Taste (windows) und löschen Sie alle von Ihnen.
InformationsquelleAutor der Antwort Pedro Ballesteros