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?



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.


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 .


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 ...


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.
    

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.


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.


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


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

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)


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/ .)


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.


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.


8

So entfernen Sie entfernte Zweige:

$git remote prune origin

So entfernen Sie bereits zusammengeführte lokale Zweige:

$git branch -D $(git branch --merged)

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

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

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.


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


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

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.


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.


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

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.


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.


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>

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


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.


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

-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.


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.


Es ist lustig, wie negativ diese Antwort wahrgenommen wird. Völlig gültiger Ansatz IMO, wenn Sie GUI mögen.
Serraosays
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.