So beschneiden Sie lokale Tracking-Zweige, die auf der Fernbedienung nicht mehr vorhanden sind

770

Mit git remote prune originkann ich die lokalen Zweige entfernen, die sich nicht mehr auf der Fernbedienung befinden.

Ich möchte aber auch lokale Zweige entfernen, die aus diesen entfernten Zweigen erstellt wurden (eine Überprüfung, ob sie nicht zusammengeführt sind, wäre hilfreich).

Wie kann ich das machen?

Alex
quelle
8
Mögliches Duplikat von Lokale Zweige entfernen nicht mehr auf Remote
kolen
1
Einzeiler, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf Ihrer Tastatur geschlafen: npx git-removed-branches(Trockenlauf) oder npx git-removed-branches --prune(echt). Sie müssen node.js bereits installiert haben. Siehe Antworten unten für Details.
Cristian Diaconescu

Antworten:

892

Nach dem Beschneiden können Sie die Liste der Remote-Zweige mit abrufen git branch -r. Die Liste der Zweige mit ihrem Fernverfolgungszweig kann mit abgerufen werden git branch -vv. Wenn Sie diese beiden Listen verwenden, können Sie die Fernverfolgungszweige finden, die nicht in der Liste der Fernbedienungen enthalten sind.

Diese Zeile sollte den Trick machen (erfordert bashoder zshfunktioniert nicht mit der 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 ruft die Liste der entfernten Zweige ab und übergibt sie egrepüber die Standardeingabe. Und filtert die Zweige, die einen Remote-Tracking-Zweig haben (unter Verwendung git branch -vvund Filtern für diejenigen, die einen haben origin), und erhält dann die erste Spalte dieser Ausgabe, die der Zweigname ist. Übergeben Sie schließlich alle Zweignamen an den Befehl delete branch.

Da die -dOption verwendet wird, werden keine Zweige gelöscht, die nicht mit dem Zweig zusammengeführt wurden, in dem Sie sich befinden, wenn Sie diesen Befehl ausführen.

Denken Sie auch daran , dass Sie laufen müssen werde git fetch --prune zuerst , sonst git branch -rwird die Fernbedienung immer noch Zweige sehen.

Schleis
quelle
12
Das hat bei mir perfekt funktioniert. Irgendwie git fetch -pist das nicht immer genug?
Stefan Hendriks
16
Leider funktioniert dies in Git Bash unter Windows nicht. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required Irgendwelche Ideen?
Ludder
37
Um es als Alias ​​hinzuzufügen:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410
126
Gibt es einen vorgeschlagenen Befehl für eine zukünftige Git-Version, der dies tun wird? Dieser Befehl sieht aus wie meine Katze auf meinem Laptop war
Bron Davies
5
Die Verwendung git branch -Dam Ende des Befehls hat für uns besser funktioniert, da wir dazu neigen, Commits beim Zusammenführen zu quetschen, was zu The branch x is not fully mergedFehlern beim Ausführen mit führt -d.
Mateus Gondim
430

Wenn Sie alle lokalen Zweige löschen möchten, die bereits mit dem Master zusammengeführt wurden, können Sie den folgenden Befehl verwenden:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

Weitere Infos .

jackocnr
quelle
4
Hat perfekt funktioniert, denke ich! Könnte jemand erklären, ob diese Antwort etwas anderes tut als die akzeptierte Antwort?
Andrew
11
Kleinere Verbesserung: Verwenden Sie diese xargs -r git branch -dOption, damit nichts ausgeführt wird, wenn keine zu löschenden Zweige vorhanden sind. Beachten Sie, dass die -rFlagge möglicherweise nicht überall verfügbar ist
Jacob Wang
8
Da grep aufgrund von Git-Farben möglicherweise nicht übereinstimmt:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D
5
@NickRes sieht, wie Sie so nett gefragt haben, git branch --merged masterZweige auf, die zu master zusammengeführt werden, dann schließt der mittlere grep-Teil den Master selbst aus (wir wollen den Master nicht löschen!), Und der letzte xargs-Teil wird git branch -dauf jedem von ausgeführt (Zweig löschen) die Ergebnisse. Oder lesen Sie einfach den Link Weitere Informationen in der Antwort;)
jackocnr
14
Verbesserung : git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. Die Ausgabe von git v2.10.1 zeigt "* master" an, wenn der Master ausgecheckt ist. Ich werde den Meister sowohl mit als auch ohne Sternchen los.
Esteban
162

Inmitten der Informationen von git help fetchgibt es diesen kleinen Punkt:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

Also, vielleicht git fetch -pist das , wonach Sie suchen?

EDIT: Ok, für diejenigen, die diese Antwort 3 Jahre später noch diskutieren, hier ein paar weitere Informationen darüber, warum ich diese Antwort präsentiert habe ...

Erstens sagt das OP, dass sie "auch die lokalen Zweige entfernen möchten, die aus diesen entfernten Zweigen [die sich nicht mehr auf der entfernten befinden] erstellt wurden". Dies ist in nicht eindeutig möglich git. Hier ist ein Beispiel.

Angenommen, ich habe ein Repo auf einem zentralen Server und es hat zwei Zweige, genannt Aund B. Wenn ich dieses Repo auf mein lokales System klone, werden auf meinem Klon lokale Refs (noch keine tatsächlichen Zweige) aufgerufen origin/Aund origin/B. Nehmen wir jetzt an, ich mache Folgendes:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

Die relevanten Fakten hier sind, dass ich mich aus irgendeinem Grund dafür entschieden habe, einen Zweig in meinem lokalen Repo zu erstellen, der einen anderen Namen als seinen Ursprung hat, und ich habe auch einen lokalen Zweig, der (noch) nicht im Ursprungs-Repo existiert.

Lassen Sie uns jetzt sagen , dass ich beide entfernen das Aund BZweige auf dem Remote - Repo und aktualisieren meine lokalen Repo ( git fetchin irgendeiner Form), die meine lokalen Refs verursacht origin/Aund origin/Bverschwinden. Nun, meine lokale Repo hat drei Zweige noch, A, Z, und C. Keiner von diesen hat einen entsprechenden Zweig auf dem Remote-Repo. Zwei von ihnen wurden "aus ... entfernten Zweigen erstellt", aber selbst wenn ich weiß, dass es früher einen Zweig gab, der Bnach dem Ursprung aufgerufen wurde , kann ich nicht wissen, dass Zdieser Zweig erstellt wurdeB, weil es dabei wahrscheinlich aus gutem Grund umbenannt wurde. Ohne externe Metadaten zur Erfassung von Zweigursprüngen oder einen Menschen, der die Historie kennt, ist es unmöglich zu sagen, auf welchen der drei Zweige das OP gegebenenfalls abzielt. Ohne einige externe Informationen, gitdie nicht automatisch für Sie gepflegt werden, git fetch -pist sie so nah wie möglich, und jede automatische Methode, um buchstäblich zu versuchen, was das OP verlangt, läuft Gefahr, entweder zu viele Zweige zu löschen oder einige zu verpassen, die das OP sonst hätte gelöscht werden wollen.

Es gibt auch andere Szenarien, z. B. wenn ich drei separate Zweige erstelle origin/A, um drei verschiedene Ansätze für etwas zu testen, und dann origin/Averschwindet. Jetzt habe ich drei Zweige, die offensichtlich nicht alle namentlich übereinstimmen können, aber aus denen sie erstellt origin/Awurden. Eine wörtliche Interpretation der OP-Frage würde daher das Entfernen aller drei Zweige erfordern. Dies ist jedoch möglicherweise nicht wünschenswert, wenn Sie sogar einen zuverlässigen Weg finden könnten, um sie anzupassen ...

Twalberg
quelle
108
Dies löscht nicht die lokalen Zweige, sondern nur die entfernten Zeiger auf die Zweige
Jaap
4
Es werden nur diese lokalen Zweige gelöscht, die in Remote nicht vorhanden sind UND Sie haben sie nie ausgecheckt.
Jarek Jakubowski
15
Sie sollten die Frage genauer lesen, wie Jaap bemerkt. Leute, die für diese Antwort stimmen, sollten auch lesen, worum es bei der Frage wirklich geht.
Søren Boisen
4
Ja, genau das wollte ich tun! @ SørenBoisen Ich hoffe, dass Sie in den letzten zwei Jahren Zeit hatten, Ihre Meinung zu überdenken ... Wenn auf SO gepostete Inhalte immer nur mit dem zusammenhängen sollten, was manchmal wirklich verwirrte OPs verlangen, würden wir viele Informationen entfernen. Bitte nehmen Sie nicht an, Personen anzuweisen, wie sie diese Website nutzen können, außer den offiziellen Richtlinien, und sie verhindern eindeutig keine orthogonalen, aber nützlichen Antworten.
Félix Gagnon-Grenier
6
@ FélixGagnon-Grenier Hier ist mein Problem mit dieser Antwort: 1) Die Frage ist kristallklar, OP ist eindeutig nicht verwirrt. 2) Diese Antwort erwähnt nicht, dass sie die Frage nicht beantwortet! 3) Die Frage gibt bereits eine Möglichkeit an, nicht mehr vorhandene Fernverfolgungszweige zu beschneiden, sodass ein Wert von Null hinzugefügt wird.
Søren Boisen
117

Dadurch werden die lokalen Zweige gelöscht, für die die Fernverfolgungszweige entfernt wurden. (Stellen Sie sicher, dass Sie auf dem masterAst sind!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Einzelheiten:

  • git branch -vv Zeigt "weg" für lokale Zweige an, für die die Fernbedienung beschnitten wurde.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dprüft, ob es zusammengeführt wurde ( -Dlöscht es trotzdem)

    error: The branch 'mybranch' is not fully merged.
    
wisbucky
quelle
16
Sie können den Befehl sogar mitgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg
4
Ich möchte nur darauf hinweisen, dass Sie vorher auf dem Master sein sollten, da git branch -ddie Zweige mit denen verglichen werden HEAD.
Steve Bennett
Ausgezeichnet! Ich habe danach gesucht und gesucht. Ich wünschte, ich hätte Ihre Antwort gesehen, bevor ich sie selbst herausgefunden hätte. Es hätte mir ein paar Minuten gespart. Hier ist meine andere Antwort: stackoverflow.com/questions/15661853/…
Karl Wilbur
1
prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Am
3
Oh Mann ... zum Glück MÜSSEN Sie Ihre Antwort aktualisieren, um den Leuten zu sagen, dass sie auf dem Master sein sollten. Habe das gerade aus einer anderen Branche gemacht. @ stebenbennet2 danke für den informativen Kommentar
GrayedFox
53

Man kann Git so konfigurieren, dass beim Abrufen automatisch Verweise auf gelöschte Remote-Zweige entfernt werden:

git config --global fetch.prune true

Beim Aufrufen git fetchoder git pulldanach werden Verweise auf gelöschte Remote-Zweige automatisch entfernt.

wedesoft
quelle
5
Dadurch werden keine lokalen Zweige entfernt, sondern nur Verweise auf sie, oder?
Clint Eastwood
@ClintEastwood Es werden nur Verweise auf entfernte Zweige gelöscht . Sie können Verweise auf Remote-Zweige mit auflisten git branch -r.
Wedesoft
52

Es gibt ein ordentliches NPM-Paket, das dies für Sie erledigt (und es sollte plattformübergreifend funktionieren).

Installieren Sie es mit: npm install -g git-removed-branches

Und dann git removed-brancheszeigen wir Ihnen alle abgestandenen lokalen Filialen, undgit removed-branches --prune sie tatsächlich löschen.

Mehr Infos hier.

tzachs
quelle
1
Dies sollte wirklich mehr positive Stimmen haben. Vielen Dank, dass Sie das Leben unabhängig von der Plattform einfacher gemacht haben.
Verschlüsselung
Handliche kleine Erweiterung. Unter Windows 10 installiert und funktioniert einwandfrei. Kleiner Hinweis: Nicht zusammengeführte Zweige werden als beschneidbar angesehen (Fehler beim Ausführen von --prune, obwohl Verzweigung -d aufgerufen wurde). Sie werden jedoch in der Initiale nicht als solche bezeichnet Auflistung angezeigt.
user2864740
1
Das ist meine Lieblingsantwort. npx git-removed-branchesfunktioniert wie ein Traum.
Drazisil
Ja! Dies sollte mehr positive Stimmen haben! so einfache und intuitive Lösung für Clis Neuling
Geoseong
Es wäre nützlich, einen Überblick darüber zu geben, was das Tool aus der Sicht von git tut.
Ryanwebjackson
41

Windows-Lösung

Für Microsoft Windows Powershell:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

Erklärung

git checkout master wechselt in den Hauptzweig

git remote update origin --prune beschneidet entfernte Zweige

git branch -vverhält eine ausführliche Ausgabe aller Zweige ( Git-Referenz )

Select-String -Pattern ": gone]" Ruft nur die Datensätze ab, bei denen sie von der Fernbedienung entfernt wurden.

% { $_.toString().Split(" ")[0]} Holen Sie sich den Filialnamen

% {git branch -d $_} löscht den Zweig

chris31389
quelle
Schönes Beispiel. Alternativ git remote prune originkann auch select-string nicht mit der neuesten Version von git übereinstimmen. Erwägen Sie die Verwendung vonConvertFrom-String -TemplateContent
Bernie White
3
Es sieht so aus, als ob die neueste Version von git einige nachgestellte Leerzeichen hinzufügt, sodass der Split nicht funktioniert, um den Zweignamen abzurufen. Do .toString (). Trim (). Split ("") und es wird
Chris Hynes
Hier ist meins:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Omzig
@Omzig Was macht das anders? Können Sie eine Erklärung geben>
chris31389
@ chris31389, ich habe die Möglichkeit, alles, was mir fehlt, vom Master zu bekommen, und ich habe den Zweig in --merged und nicht in master geändert. Ich möchte sicherstellen, dass ich nur die --merged-Zweige lösche. Ich fühle mich einfach besser;)
Omzig
27

Es werden die lokalen Zweige aufgelistet, deren Fernverfolgungszweig von der Fernbedienung gelöscht wird

$ git remote prune origin --dry-run

Wenn Sie diese lokalen Zweige von lokalen Zweigen entfernen möchten, die nicht verfolgt werden

$ git remote prune origin
027
quelle
19
Dies beantwortet die Frage nicht, das wusste das OP bereits.
Ken Williams
2
Ich stimme auch zu, aber wenn Sie nach "So beschneiden Sie lokale Tracking-Zweige, die auf der Fernbedienung nicht mehr vorhanden sind" suchen, ist dies der Top-Link und diese Antwort stimmt mit dem Titel überein (nicht, wenn Sie die vollständige Beschreibung in Frage gestellt haben) ist der Grund für Up Votes :)
027
Dadurch werden die lokalen Zweige nicht entfernt. Immer noch da, nachdem ich das ausgeführt habe
Xin
@Xin Versuchen Sie, den Befehl ohne das Argument --dry-run auszuführen, da er den Befehl nicht tatsächlich ausführt, sondern Ihnen zeigt, was er ändern wird.
Torsten Ojaperv
19

Wie @tzacks bemerkt ... gibt es ein npm-Paket, das dafür praktisch ist. Mach einfach:

npx git-removed-branches --prune

(Ich hätte kommentiert, aber nicht genug Ruf)

Johnny
quelle
1
Herrlich. Kein Ärger. Ich bin froh, dass dies eine vollständige Antwort war!
Dan Rayson
1
Dies sollte oben sein. Funktioniert auch unter Windows.
Tomtastico
14

Wenn Sie Windows und Powershell verwenden, können Sie Folgendes verwenden, um alle lokalen Zweige zu löschen, die mit dem aktuell ausgecheckten Zweig zusammengeführt wurden:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

Erläuterung

  • Listet den aktuellen Zweig und die Zweige auf, die darin zusammengeführt wurden
  • Filtert den aktuellen Zweig heraus
  • Bereinigt alle führenden oder nachfolgenden Leerzeichen von der git Ausgabe für jeden verbleibenden Zweignamen
  • Löscht die zusammengeführten lokalen Zweige

Es lohnt sich zu rennen git branch --merged sich, zuerst alleine nur um sicherzustellen, dass nur das entfernt wird, was Sie erwarten.

(Portiert / automatisiert von http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ .)

Mücke
quelle
10

Noch kürzer und sicherer Einzeiler:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

Stellen Sie sicher, dass Sie zu einem Zweig auschecken, der noch nicht zusammengeführt wurde, bevor Sie ihn ausführen. Weil Sie den aktuell eingecheckten Zweig nicht löschen können.

FelikZ
quelle
3
Wird dies auch Ihren 'Master' entfernen?
dcsan
2
Wenn Sie derzeit in Master eingecheckt haben, dann nein, sonst ja
FelikZ
1
Um Master zu überspringen, können Sie einfach zu grep git branch -d $(git branch --merged | cut -c 3- | grep -v master)
leiten
Dies ist unsicher und jemand in der Zukunft wird unwissentlich seinen Hauptzweig löschen
jasonseminara
1
@jasonseminara #dcsan Ich habe das Snippet aktualisiert, sodass der Hauptzweig übersprungen wird. #mozillalives danke
FelikZ
9

Ich wollte etwas, das alle lokalen Zweige löscht, die einen Remote-Zweig verfolgen, auf origindem der Remote-Zweig gelöscht wurde ( gone). Ich wollte keine lokalen Zweige löschen, die nie für die Verfolgung eines Remote-Zweigs eingerichtet wurden (dh meine lokalen Entwicklungszweige). Außerdem wollte ich einen einfachen Einzeiler, der nur verwendet git, oder andere einfache CLI-Tools, anstatt benutzerdefinierte Skripte zu schreiben. Am Ende habe ich ein bisschen von grepund verwendet awk, um diesen einfachen Befehl zu erstellen, und ihn dann als Alias ​​in meinem hinzugefügt ~/.gitconfig.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

Hier ist ein git config --global ...Befehl zum einfachen Hinzufügen git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

HINWEIS: Verwendung der -DFlagge zugit branch kann sehr gefährlich sein. Also benutze ich im obigen Befehl config die -dOption to git branchanstatt -D; Ich benutze -Din meiner aktuellen Konfiguration. Ich benutze, -Dweil ich nicht möchte, dass Git sich über nicht zusammengeführte Zweige beschwert, ich möchte nur, dass sie verschwinden. Möglicherweise möchten Sie diese Funktionalität auch. Wenn ja, verwenden Sie einfach -Dstatt -dam Ende dieses Konfigurationsbefehls.

Karl Wilbur
quelle
8

So entfernen Sie entfernte Zweige:

$git remote prune origin

So entfernen Sie bereits zusammengeführte lokale Zweige:

$git branch -D $(git branch --merged)
Aniket
quelle
Funktioniert bei mir. Vielen Dank.
AndroidRuntimeException
2
(git branch --merged) gibt für mich auch 'master' zurück. Und andere Zweige, die auf der Fernbedienung nicht gelöscht wurden.
Tom G
8
Dadurch wurde mein Hauptzweig gelöscht.
Greg
5

Es scheint keinen sicheren Einzeiler zu geben, zu viele Randfälle (wie ein Zweig, dessen Name "Master" enthält usw.). Am sichersten sind diese Schritte:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. Zeigen Sie die Datei an und entfernen Sie Zeilen für Zweige, die Sie behalten möchten (z. B. Hauptzweig!). Sie müssen den Inhalt einer Zeile nicht bearbeiten
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d
Oliver
quelle
5

Basierend auf den obigen Antworten verwende ich diesen kürzeren Einzeiler:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

Wenn Sie bereits beschnitten sind und lokale baumelnde Zweige haben, werden diese dadurch aufgeräumt:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d
Hidralisk
quelle
1
Funktioniert nicht, wenn Ihre Branche Namen ein haben /in ihnen
theicfire
4

Ich bin mir nicht sicher, wie ich alles auf einmal machen soll, aber git git branch -d <branchname>löscht einen lokalen Zweig NUR, wenn er vollständig zusammengeführt ist. Beachten Sie den Kleinbuchstaben d.

git branch -D <branchname> (Beachten Sie das Großbuchstaben D) Löscht eine lokale Niederlassung unabhängig von ihrem zusammengeführten Status.

NHDaly
quelle
Unter Windows haben die anderen Antworten bei mir nicht funktioniert. Die Verwendung dieser Antwort mit dem einfachen -D-Schalter war möglich (obwohl der Zweig bereits "gelöscht" wurde).
Können wir das für alle Branchen gleichzeitig tun?
Teoman Shipahi
3

Sie können diesen Befehl verwenden:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git Clean: Löschen Sie bereits zusammengeführte Zweige, einschließlich der Aufschlüsselung des Befehls

sendon1982
quelle
Sie müssen keine Zweige herausfiltern (Ex-Master). Wenn es "zusammengeführt" ist, bedeutet dies nur, dass Ihre lokale Kopie entfernt wird, aber "git checkout dev" erstellt einen lokalen Zweig von remote, falls nicht bereits vorhanden
csga5000
Die lokale Zweigstellenliste ist jedoch auch dann noch vorhanden, wenn sie zusammengeführt werden. Dieser Befehl dient zum Entfernen dieser Zweige, die von der Fernbedienung gelöscht wurden.
sendon1982
Ein Sternchen am Anfang bedeutet, dass der aktuelle Zweig, wenn Sie diesen Befehl auf einem anderen Zweig ausführen, nicht gut funktioniert
OzzyCzech
2

Basierend auf den obigen Antworten kam ich mit dieser einzeiligen Lösung:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
gagarwal
quelle
2

Unter Verwendung einer Variante der Antwort von @ wisbucky habe ich meiner ~/.gitconfigDatei Folgendes als Alias ​​hinzugefügt :

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

Mit dieser Funktion git pruneitgoodwerden sowohl lokale als auch Remote-Zweige, die nach dem Zusammenführen nicht mehr benötigt werden , auf einfache Weise bereinigt.

Ken Williams
quelle
2

Die Powershell-Version von git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Dadurch werden alle lokalen Zweige entfernt, die mit dem Master zusammengeführt wurden, während Sie sich im Master-Zweig befinden .

git checkout master wechseln.

Kevin George
quelle
1

Schleis 'Variante funktioniert bei mir nicht (Ubuntu 12.04), also lassen Sie mich meine (klaren und glänzenden :) Varianten vorschlagen:

Variante 1 (ich würde diese Option bevorzugen):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Variante 2:

ein. Probelauf:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b. Zweige entfernen:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D
daniilyar
quelle
1

Es folgt eine Anpassung der Antwort von @ wisbucky für Windows-Benutzer:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

Ich benutze posh-git und leider mag PS das Nackte nicht for, deshalb habe ich ein einfaches altes Befehlsskript namens PruneOrphanBranches.cmd erstellt:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

Rufen Sie es ohne Parameter auf, um eine Liste anzuzeigen, und rufen Sie es dann mit "-d" auf, um das eigentliche Löschen durchzuführen, oder "-D" für alle Zweige, die nicht vollständig zusammengeführt wurden, die Sie aber trotzdem löschen möchten.

Sam C.
quelle
Das hat bei mir nicht funktioniert, irgendwie hat das :oder : (mit einem Leerzeichen) dazu geführt, findstrdass es jedes Mal zu allem passt - ich habe fast den Master gelöscht. Die Verwendung eines regulären Ausdrucks funktionierte jedoch einwandfrei:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Josh
1

Versuchen Sie dies in git bash, um Verweise auf gelöschte Zweige abzurufen und zu bereinigen, und bereinigen Sie dann die lokalen Zweige, die die entfernten Zweige verfolgten:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

Denken Sie daran, zuerst einen Zweig auszuchecken, der nicht gelöscht wird, damit das Löschen des Zweigs nicht blockiert wird.

Guillermo Gutiérrez
quelle
0

Ich habe die akzeptierte Antwort in ein robustes Skript umgewandelt. Sie finden es in meinem Git-Extensions-Repository .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>
Ingo Karkat
quelle
0

Ich erreichte diese Seite und suchte nach der Antwort für "Wie lösche ich lokal ausgecheckte Zweige, die keinen vorgelagerten Zweig mehr haben?"

Es war mir auch egal, ob der lokale Zweig noch zusammengeführt wurde oder nicht, da das git branch -dWeiterleiten in einfach warnt, anstatt nicht zusammengeführte lokale Zweige zu löschen.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff
Meredith
quelle
0

In Powershell :

git branch -D (git branch --merged |% { $_.trim() } )
Raúl Salinas-Monteagudo
quelle
0

Hier ist meine Lösung:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p dient zum Entfernen von Remote-Tracking-Referenzen, die auf der Remote nicht mehr vorhanden sind. Im ersten Schritt werden also Verweise auf entfernte Zweige entfernt.

  • -vv dient zum Anzeigen von sha1 und zum Festschreiben der Betreffzeile für jeden Kopf sowie der Beziehung zum vorgelagerten Zweig (falls vorhanden). Im zweiten Schritt werden alle lokalen Zweige abgerufen, und der Befehl grep filtert gelöschte Zweige heraus.

Neeraj Bansal
quelle
Noch kleiner (wie in einem anderen Kommentar beschrieben)git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
mrroboaat vor
-2

Löschen Sie alle Zweige, die mit dem Master nicht auf dem neuesten Stand sind

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null
Jason Waldrip
quelle
-3

Ich bin mir ziemlich sicher, dass git remote prune origindu das willst.

Sie können es ausführen, um git remote prune origin --dry-runzu sehen, was es tun würde , ohne Änderungen vorzunehmen.

Jason Antman
quelle
12
Dadurch wird der lokale Zweig selbst nicht entfernt.
Taytay
-16

Verwenden Sie die GUI? Manuelle Vorgehensweise, aber schnell und einfach.

$ git gui

Wählen Sie "Zweig -> Löschen". Sie können mehrere Zweige mit Strg-Klick (Fenster) auswählen und alle entfernen.

Pedro Ballesteros
quelle
Es ist lustig, wie negativ diese Antwort wahrgenommen wird. Völlig gültiger Ansatz IMO, wenn Sie GUI mögen.
Serraosays