Ich folge einem Entwicklungsprozess, in dem ich für jedes neue Feature oder jede Story-Card einen neuen lokalen Zweig erstellt. Wenn ich fertig bin, füge ich den Zweig in master zusammen und drücke dann Push.
Was im Laufe der Zeit aufgrund einer Kombination von Faulheit oder Vergesslichkeit passiert, ist, dass ich eine große Liste von lokalen Niederlassungen bekomme, von denen einige (z. B. Spikes) möglicherweise nicht zusammengeführt wurden.
Ich weiß, wie ich alle meine lokalen Filialen auflisten kann, und ich weiß, wie ich einen einzelnen Zweig entfernen kann, aber ich habe mich gefragt, ob es einen git-Befehl gibt, mit dem ich alle meine lokalen Filialen löschen kann.
Unten ist die Ausgabe des Befehls git branch --merged
.
[email protected]:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Alle Versuche, Zweige zu löschen, die mit grep -v \*
(gemäß den Antworten unten) aufgelistet sind, führen zu Fehlern:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Ich benutze:
git 1.7.4.1
ubuntu 10.04
GNU bash, Version 4.1.5 (1) -freigabe
GNU grep 2.5.4
Nur ein Hinweis, ich würde auf git 1.7.10 upgraden. Möglicherweise erhalten Sie hier Antworten, die bei Ihrer Version nicht funktionieren. Meine Vermutung ist, dass Sie dem Zweignamen refs/heads/
voranstellen müssten.
ACHTUNG: Fahren Sie mit den folgenden Schritten nur fort, wenn Sie eine Kopie Ihres Arbeitsordners und des .git-Verzeichnisses erstellt haben.
Manchmal mache ich einfach die Äste, die ich nicht direkt aus .git/refs/heads
möchte. Alle diese Zweige sind Textdateien, die die 40 Zeichen sha-1 des Commit enthalten, auf den sie zeigen. In Ihrem .git/config
haben Sie fremde Informationen, wenn Sie für ein bestimmtes Tracking ein bestimmtes Tracking eingerichtet haben. Sie können diese Einträge auch manuell löschen.
Der Unterbefehl 'git branch -d' kann mehrere Verzweigungen löschen. Vereinfachen Sie also die Antwort von @ sblom, fügen Sie jedoch wichtige Xargs hinzu:
git branch -D `git branch --merged | grep -v \* | xargs`
oder weiter vereinfacht zu:
git branch --merged | grep -v \* | xargs git branch -D
Wie von @AndrewC angemerkt, wird die Verwendung von git branch
für die Skripterstellung dringend empfohlen. Um dies zu vermeiden, verwenden Sie Folgendes:
git for-each-ref --format '%(refname:short)' refs/heads | grep -v master | xargs git branch -D
Vorsicht bei Löschungen geboten!
$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
Story-123-a
Story-123-b
Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).
Ich fand einen schöneren Weg in einem Kommentar zu diesem Thema auf github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
edit: fügte keine Farboption hinzu und schließt stabile Verzweigungen aus (fügen Sie ggf. weitere Zweige hinzu)
Das Analysieren der Ausgabe von git branch
wird nicht empfohlen und ist keine gute Lösung für zukünftige Leser von Stack Overflow.
git branch
ist ein Porzellanbefehl. Porzellanbefehle können nicht maschinell analysiert werden, und die Ausgabe kann sich zwischen verschiedenen Git-Versionen ändern. git
branch
auf eine Weise ändern, die das Parsen erschwert (z. B. Kolorierung). Wenn ein Benutzer color.branch
festgelegt hat, werden in der Ausgabe Steuercodes angezeigt. Dies führt zu error: branch 'foo' not found.
, wenn Sie versuchen, ihn in einen anderen Befehl umzuleiten. Sie können dies mit dem Flag --no-color
zu git branch
umgehen, aber wer weiß, welche anderen Benutzerkonfigurationen möglicherweise Probleme verursachen.git branch
kann andere Dinge tun, die für die Analyse ärgerlich sind, z. B. Setzen Sie ein Sternchen neben den gerade ausgecheckten ZweigDer Maintainer von git hat folgendes zu sagen über das Scripting um git branch
Ausgabe
Um herauszufinden, was der aktuelle Zweig ist, haben gelegentliche/nachlässige Benutzer möglicherweise Skript um Git Zweig, das ist falsch. Wir raten aktiv ab gegen die Verwendung eines Porzellan-Befehls, einschließlich Git-Zweig, in Skripts, da die Ausgabe des Befehls in .__ geändert werden kann. Hilfe beim Konsum von Menschen.
Ähnlich problematisch sind Antworten, die die manuelle Bearbeitung von Dateien im Verzeichnis .git
vorschlagen (wie .git/refs/heads) (Refs können stattdessen in .git/package-refs enthalten sein oder Git ändert in Zukunft sein internes Layout).
Git bietet den Befehl for-each-ref
zum Abrufen einer Liste von Zweigen.
Git 2.7.X führt die --merged
-Option ein, mit der Sie die folgenden Äste in HEAD
suchen und löschen können.
for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
git branch -d ${mergedBranch}
done
In Git 2.6.X und älter müssen Sie alle lokalen Niederlassungen auflisten und sie einzeln testen, um festzustellen, ob sie zusammengeführt wurden (was erheblich langsamer und etwas komplizierter ist).
for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done
So löschen Sie jeden Zweig außer dem, den Sie gerade ausgecheckt haben:
for b in `git branch --merged | grep -v \*`; do git branch -D $b; done
Ich würde empfehlen, git branch -D $b
in den ersten Male in einen echo $b
zu ändern, um sicherzustellen, dass die gewünschten Zweige gelöscht werden.
Der einfachere Weg, um alle Zweige zu löschen, aber andere wie "Develop" und "Master" zu behalten, ist die folgende:
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
sehr hilfreich !
Ich fand es einfacher, Texteditor und Shell zu verwenden.
git checkout <TAB>
in der Shell ein. Zeigt alle lokalen Niederlassungen an.git branch -D <PASTE THE BRANCHES NAMES HERE>
ein.Das ist es.
Mit dem folgenden Befehl werden alle lokalen Zweigstellen außer dem Master-Zweig gelöscht.
git branch | grep -v "master" | xargs git branch -D
Der obige Befehl
Ich hatte eine ähnliche Situation und fand den folgenden Befehl kürzlich für nützlich.
git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`
Wenn Sie mehrere Zweige behalten möchten, dann
git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`
hoffe das hilft jemandem.
Wenn Sie Git nicht selbst durchlaufen müssen, können Sie die Köpfe unter .git/refs/heads manuell oder programmgesteuert löschen. Folgendes sollte mit minimalem Tweaking unter Bash funktionieren:
shopt -s extglob
rm -rf .git/refs/heads/!(master)
Dadurch wird jeder lokale Zweig außer Ihrem Hauptzweig gelöscht. Da Ihre Upstream-Zweigstellen unter .git/refs/remote gespeichert sind, bleiben sie unangetastet.
Wenn Sie nicht Bash verwenden oder viele Git-Repositories auf einmal rekursieren möchten, können Sie mit GNU etwas Ähnliches suchen:
find . \
-path remotes -path logs -Prune -o \
-wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf
Die Suchlösung ist wahrscheinlich portabler, aber das Beschneiden von Pfaden und Dateinamen ist schwierig und möglicherweise fehleranfälliger.
Zum Löschen aller lokalen Zweige in Linux mit Ausnahme von dem Zweig, in dem Sie sich befinden
// hard delete
git branch -D $(git branch)
Keine der Antworten hat meine Bedürfnisse voll erfüllt, also gehen wir weiter:
git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote Prune Origin
Dadurch werden alle lokalen Zweige gelöscht, die zusammengefügt werden und mit feature/
, bugfix/
oder hotfix/
beginnen. Danach wird die Upstream-Fernbedienung Origin
gelöscht (möglicherweise müssen Sie ein Kennwort eingeben).
Funktioniert auf Git 1.9.5.
Basierend auf einer Kombination mehrerer Antworten hier - wenn Sie alle auf remote vorhandenen Zweige beibehalten möchten, aber den Rest löschen möchten , erledigt der folgende Oneliner den Vorgang:
git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads Origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D
Löschen Sie in der Windows-Befehlszeile alle außer der aktuellen ausgecheckten Verzweigung mit:
for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f
Die obigen Antworten funktionieren einwandfrei. Hier ist ein anderer Ansatz, wenn wir viele Zweige in lokalem Repository haben und wir viele Zweige löschen müssen, mit Ausnahme weniger, die in lokaler Maschine liegen.
Zuerst listet git branch
Alle lokalen Zweige auf.
So transponieren Sie die Spalte mit den Zweignamen in eine einzelne Zeile in der Datei, indem Sie einen Unix-Befehl ausführengit branch > sample.txt
Dadurch wird es in der Datei sample.txt gespeichert. Und Rennawk 'BEGIN { ORS = " " } { print }' sample.txt
Befehl in Shell. Dadurch wird die Spalte in eine Zeile umgewandelt und die Liste der Zweignamen in eine einzelne Zeile kopiert.
Und dann renngit branch -D branch_name(s)
.
Dadurch werden alle in local vorhandenen aufgelisteten Zweige gelöscht
Der pragmatischste Weg: Stellen Sie sicher, dass Sie nicht uneingeschränkt an master
arbeiten, verpflichten Sie sich/Push, falls erforderlich, klonen Sie eine neue Kopie des Repository und löschen Sie die alte.
Ich habe ein Shell-Skript geschrieben, um alle lokalen Zweige mit Ausnahme von develop
zu entfernen.
branches=$(git branch | tr -d " *")
output=""
for branch in $branches
do
if [[ $branch != "develop" ]]; then
output="$output $branch"
fi
done
git branch -d $output
Das folgende Skript löscht Zweige. Verwenden Sie es und ändern Sie es auf eigenes Risiko usw. usw.
Basierend auf den anderen Antworten in dieser Frage schrieb ich schließlich ein kurzes Bash-Skript für mich. Ich habe es "gitbd" (git branch -D) genannt, aber wenn Sie es verwenden, können Sie es nach Belieben umbenennen.
gitbd() {
if [ $# -le 1 ]
then
local branches_to_delete=`git for-each-ref --format '%(refname:short)' refs/heads/ | grep "$1"`
printf "Matching branches:\n\n$branches_to_delete\n\nDelete? [Y/n] "
read -n 1 -r # Immediately continue after getting 1 keypress
echo # Move to a new line
if [[ ! $REPLY == 'N' && ! $REPLY == 'n' ]]
then
echo $branches_to_delete | xargs git branch -D
fi
else
echo "This command takes one arg (match pattern) or no args (match all)"
fi
}
Es wird angeboten, alle Verzweigungen zu löschen, die einem Musterargument entsprechen, wenn übergeben, oder alle lokalen Verzweigungen, wenn sie ohne Argumente aufgerufen werden. Es gibt auch einen Bestätigungsschritt, da wir Dinge löschen, das ist Nizza.
Es ist irgendwie dumm - wenn es keine Äste gibt, die mit dem Muster übereinstimmen, erkennt es dies nicht.
Ein Beispielausgabelauf:
$ gitbd test
Matching branches:
dummy+test1
dummy+test2
dummy+test3
Delete? [Y/n]
Für Powershell wird dies funktionieren:
git branch --format '%(refname:lstrip=2)' --merged `
| Where-Object { $_ -ne 'master' } `
| ForEach-Object { git branch -d $_ }
Stellen Sie sicher, dass Sie dies zuerst tun
git fetch
Wenn Sie alle Informationen zu fernen Zweigen haben, können Sie mit dem folgenden Befehl alle Zweige mit Ausnahme von master entfernen.
git branch -a | grep -v "master" | grep remotes | sed 's/remotes\/Origin\///g' | xargs git Push Origin --delete
Obwohl dies keine Befehlszeilenlösung ist, bin ich überrascht, dass die Git-GUI noch nicht vorgeschlagen wurde.
Ich benutze die Befehlszeile zu 99% der Zeit, aber in diesem Fall ist es entweder zu langsam (daher die ursprüngliche Frage), oder Sie wissen nicht, was Sie löschen möchten, wenn Sie zu einer längeren, aber cleveren Shell-Manipulation greifen.
Die Benutzeroberfläche löst dieses Problem, da Sie die zu entfernenden Zweige schnell abhaken können und an diejenigen erinnert werden, die Sie behalten möchten, ohne dass Sie für jeden Zweig einen Befehl eingeben müssen.
Gehen Sie von der Benutzeroberfläche zu Branch -> Delete und Ctrl +. Klicken Sie auf die zu löschenden Zweige, damit sie hervorgehoben werden. Wenn Sie sicher gehen möchten, dass sie in einem Zweig (z. B. dev
) zusammengeführt werden, setzen Sie unter Nur löschen, wenn in zusammengefügt [] wird Lokaler Zweig auf dev
. Andernfalls setzen Sie es auf Always, um diese Prüfung zu ignorieren.