Problem: Ich möchte alle lokalen Zweige löschen, die keine Fernbedienung haben. Es ist leicht genug, die Namen der Zweige in eine zu leiten git branch -D {branch_name}
, aber wie bekomme ich diese Liste überhaupt?
Beispielsweise:
Ich erstelle einen neuen Zweig ohne Fernbedienung:
$ git co -b no_upstream
Ich liste alle meine Filialen auf und es gibt nur eine mit einer Fernbedienung
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
Welchen Befehl kann ich ausführen, um no_upstream
eine Antwort zu erhalten?
Ich kann laufen git rev-parse --abbrev-ref --symbolic-full-name @{u}
und das wird zeigen, dass es keine Fernbedienung hat:
$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Da dies jedoch ein Fehler ist, kann ich ihn nicht verwenden oder an andere Befehle weiterleiten. Ich beabsichtige, dies entweder als Alias für ein Shell-Skript zu verwenden git-delete-unbranched
oder vielleicht ein supereinfaches Gem zu erstellengit-branch-delete-orphans
quelle
Antworten:
Ich habe kürzlich herausgefunden,
git branch -vv
welche "sehr ausführliche" Version desgit branch
Befehls ist.Es gibt die Zweige zusammen mit den entfernten Zweigen, falls vorhanden, im folgenden Format aus:
Sobald Sie diese schön formatierte Ausgabe haben, ist es so einfach, sie durchzuleiten
cut
undawk
Ihre Liste zu erhalten:Ergebnisse in der folgenden Ausgabe:
Der
cut
Teil normalisiert nur die Daten, indem die ersten beiden Zeichen (einschließlich*
) aus der Ausgabe entfernt werden, bevor sie an übergeben werdenawk
.Der
awk
Teil druckt die erste Spalte, wenn in der dritten Spalte keine eckige Klammer vorhanden ist.Bonus: Erstellen Sie einen Alias
Erleichtern Sie die Ausführung, indem Sie einen Alias in Ihrer globalen
.gitconfig
Datei (oder wo auch immer) erstellen:Wichtig: Der Backslash muss im Alias maskiert werden, sonst haben Sie eine ungültige gitconfig-Datei.
Bonus: Fernfilterung
Wenn Sie aus irgendeinem Grund mehrere Tracking-Fernbedienungen für verschiedene Zweige haben, können Sie leicht angeben, gegen welche Fernbedienung Sie prüfen möchten. Hängen Sie einfach den Remote-Namen an das awk-Muster an. In meinem Fall ist es
origin
so, dass ich das tun kann:quelle
WIP:
..? Ist es nicht das, was ein Stash-Befehl erzeugt?git branch -vv
, würde ich das[origin/branch-name]
neben dem Ergebnis nicht sehen, selbst wenn ein entfernter Zweig vorhanden ist und mit meinem lokalen Zweig übereinstimmt . Ich musstediff
zwei Branchenlisten erstellen, um herauszufinden, was nur lokal war.git branch -vv | grep -v origin/
ist genug für michgone
?git branch
(ohne Optionen) listet nur lokale Zweige auf, aber Sie wissen nicht, ob sie einen entfernten Zweig verfolgen oder nicht.Normalerweise sollten diese lokalen Zweige nach dem Zusammenführen gelöscht werden
master
(wie in dieser Ausgabe von git-sweep zu sehen ):Dies ist nicht so vollständig wie Sie möchten, aber es ist ein Anfang.
quelle
git branch -a --merged
.Ich habe ein ähnliches Problem. Ich möchte alle lokalen Zweige entfernen, die entfernte Zweige verfolgen, die jetzt gelöscht werden. Ich stelle fest, dass dies
git remote prune origin
nicht ausreichte, um die Zweige zu entfernen, die ich entfernen möchte. Sobald die Fernbedienung gelöscht ist, möchte ich, dass auch die lokale entfernt wird. Folgendes hat bei mir funktioniert:Von meinem
~/.gitconfig
:Hier ist ein
git config --global ...
Befehl zum einfachen Hinzufügengit prune-branches
:HINWEIS : Ich änderte die
-d
zu-D
meiner aktuellen Konfiguration, weil ich nicht wollen , Git hören über unmerged Zweige beschweren. Sie können auch diese Funktionalität wünschen. Wenn ja, verwenden Sie einfach-D
statt-d
am Ende dieses Befehls.Außerdem, FWIW, wäre Ihre globale Konfigurationsdatei fast immer
~/.gitconfig
.(OS X Fix)
Wie geschrieben, funktioniert dies unter OS X aufgrund der Verwendung von
xargs -r
(danke, Korny ) nicht.Das
-r
ist zu verhindern , dass diexargs
Ausführung vongit branch -d
ohne Zweignamen, die in einer Fehlermeldung werden „fatal: branch name required
“. Wenn Ihnen die Fehlermeldung nichts ausmacht, können Sie das-r
Argument einfach entfernenxargs
und schon sind Sie fertig.Wenn Sie jedoch keine Fehlermeldung sehen möchten (und wer könnte Ihnen die Schuld geben), benötigen Sie etwas anderes, das nach einer leeren Pipe sucht. Wenn Sie in der Lage sein könnten, ifne von moreutils zu verwenden . Sie würden
ifne
vorher einfügenxargs
, wodurch diexargs
Ausführung mit leeren Daten beendet wird. HINWEIS :ifne
Betrachtet alles als nicht leer. Dies schließt Leerzeilen ein, sodass diese Fehlermeldung möglicherweise weiterhin angezeigt wird. Ich habe dies nicht unter OS X getestet.Hier ist diese
git config
Zeile mitifne
:quelle
Späte Bearbeitung:
Besser ist
Auf GNU / irgendetwas
Wenn mehr als eine Handvoll Zweige wahrscheinlich wären, gäbe es bessere Möglichkeiten,
comm -23
die Ausgabe vongit branch|sed|sort
und zu nutzengit config -l|sed|sort
.quelle
Das funktioniert bei mir:
git branch -vv | grep -v origin
(Wenn Ihre Fernbedienung einen anderen Namen als origin hat, ersetzen Sie diesen).
Dadurch werden alle Zweige aufgelistet, die keine Fernbedienung verfolgen. Dies klingt nach dem, wonach Sie suchen.
quelle
git fetch --prune
.Ich synthetisiere meinen eigenen Git-Befehl, um die
origin/***: gone
Zweige zu erhalten:git remote prune origin && git branch -vv
druckt Zweige im ausführlichen Modus.cut -c 3-
entfernt die ersten Zeichen.grep ': gone]'
druckt nur die verschwundenen entfernten Zweige.awk '{print $1}'
druckt den Filialnamen.xargs -n1 -r echo git branch -d
druckt dengit branch -d
Befehl zum Entfernen von Zweigen (-n1 verwaltet jeweils einen Befehl, -r, um die Ausgabe eines Befehls zu vermeiden, wenn kein Zweig vorhanden ist).TIPP: Entfernen Sie den Befehl "echo", um die Befehle auszuführen, anstatt nur zu drucken. Ich habe diesen Befehl im Befehl belassen, um die Befehle vor der Ausgabe an git zu überprüfen.
TIPP 2: Problem
git branch -D
genau dann, wenn Sie sicher sind, dass Sie nicht zusammengeführte Zweige entfernen möchtenquelle
Hier ist etwas, das ich in PowerShell mit Kommentaren verwendet habe, um zu erklären, was es tut. Um zu verdeutlichen, was los ist, habe ich keine abgekürzten PowerShell-Befehle (Aliase) verwendet. Fühlen Sie sich frei, es auf Ihr gewünschtes Maß an Kryptizität zu komprimieren :)
quelle
Einige der vorhandenen Antworten kombinieren:
Z.B:
quelle