Ich möchte alle Zweige löschen, die in der Ausgabe von ...
$ git branch
... aber den aktuellen Zweig in einem Schritt behalten . Ist das möglich? Wenn das so ist, wie?
Ich möchte alle Zweige löschen, die in der Ausgabe von ...
$ git branch
... aber den aktuellen Zweig in einem Schritt behalten . Ist das möglich? Wenn das so ist, wie?
Antworten:
Basierend auf der Antwort von @pankijs habe ich zwei Git-Aliase erstellt:
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
Hinzufügen in ~/.gitconfig
Und wie @torek betonte:
Beachten Sie, dass Kleinbuchstaben
-d
einen "nicht vollständig zusammengeführten" Zweig nicht löschen (siehe Dokumentation). Mit using-D
werden solche Zweige gelöscht , auch wenn dadurch Commits "verloren" gehen. Verwenden Sie dies mit großer Sorgfalt , da dadurch auch die Zweig-Reflogs gelöscht werden, sodass das übliche "Wiederherstellen nach versehentlichem Löschen" ebenfalls nicht funktioniert.
Verwenden Sie die -force
Version grundsätzlich niemals, wenn Sie nicht zu 300% sicher sind, dass Sie nichts Wichtiges verlieren. Weil es für immer verloren ist .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
löscht alle Zweige außer dem Master (ersetzen Sie den Master durch den Zweig, den Sie behalten möchten, aber dann wird der Master gelöscht)
grep -v ^*
.
master-copy
, der zum Beispiel
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
zuerst (wechseln Sie zu dem Zweig, den Sie behalten möchten> ex : master ):
git checkout master
zweitens (stellen Sie sicher , dass Sie auf dem Master sind )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(oder -D
) erlaubt mehrere Filialnamen, aber es ist etwas schwierig, automatisch "alle lokalen Filialen außer der, in der ich mich gerade befinde" anzugeben, ohne mindestens ein wenig Code zu schreiben.
Die "beste" (formal korrekte) Methode besteht git for-each-ref
darin, die Filialnamen abzurufen:
git for-each-ref --format '%(refname:short)' refs/heads
Aber dann ist es noch schwieriger herauszufinden, auf welchem Zweig Sie sich befinden (git symbolic-ref HEAD
ist die "formal korrekte" Methode dafür, wenn Sie ein ausgefallenes Skript schreiben möchten).
Bequemer können Sie verwenden git branch
, um Ihre lokalen Zweigstellennamen mit zwei Leerzeichen oder (für den aktuellen Zweig) mit einem Sternchen zu drucken *
. Führen Sie dies also durch, um die *
Version zu entfernen, und Sie erhalten durch Leerzeichen getrennte Zweignamen, die Sie dann an folgende Adresse übergeben können git branch -d
:
git branch -d $(git branch | grep -v '^*')
oder:
git branch | grep -v '^*' | xargs git branch -d
Beachten Sie, dass Kleinbuchstaben -d
einen "nicht vollständig zusammengeführten" Zweig nicht löschen (siehe Dokumentation). Mit using -D
werden solche Zweige gelöscht, auch wenn dadurch Commits "verloren" gehen. Verwenden Sie dies mit großer Sorgfalt, da dadurch auch die Zweig-Reflogs gelöscht werden, sodass das übliche "Wiederherstellen nach versehentlichem Löschen" ebenfalls nicht funktioniert.
git branch -D $(git branch | grep -v '^*')
, wenn Sie die zusammengeführten Zweige löschen möchten.
So entfernen Sie alle zusammengeführten Zweige (außer den aktuellen -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
Ich habe auch einen solchen Befehl für die vollständige Bereinigung des Repos gemacht:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
von hier genommen .
Löschen Sie alle Zweige außer einem bestimmten Zweig :
git branch | grep -v "branch name" | xargs git branch -D
Löschen Sie alle lokalen Zweige außer Entwickeln und Mastern
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Verwenden Sie für Windows in Powershell:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Löschen Sie alle zusammengeführten Zweige lokal:
git branch -D `git branch --merged | grep -v \* | xargs`
Löschen Sie alle Zweige außer einem bestimmten Zweig :
git branch | grep -v "branch name" | xargs git branch -D
Löschen Sie alle lokalen Zweige außer Entwickeln und Mastern
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Ich habe dieses Konstrukt einmal für meine Windows-Umgebung erstellt. Vielleicht hilft es jemand anderem. Während der Ausführung werden der Master und der aktuelle Zweig nicht gelöscht . Alle anderen zusammengeführten Zweige werden trotzdem gelöscht.
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
Daher sehe ich hier viele fest codierte Zweignamen ... Und ich denke, meine Antwort hier ist genauer auf den Teil der Frage "Aktueller Zweig", während sie einzeilig und lesbar bleibt, um Neulinge wie mich zu verprügeln. Nur um das Guthaben dort zu platzieren, wo es fällig ist, basiert die Antwort offensichtlich auch auf der Antwort von @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
und ich habe es in einer Zeile in meinen .bash_aliases auch in debian aliased.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Obwohl ich denke, dass einige Bash-Funktionen aktiviert werden müssen, damit der Unterbefehl auf einigen Befehlszeilen ausgeführt werden kann)
Ich benutze dies, weil ich selektiver bin, was ich nicht löschen möchte. Mit dem folgenden Befehl werden alle Zweige außer Master, Develop und dem aktuellen Zweig entfernt.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Also habe ich das in meine ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO ist der sicherste Weg, um lokale Niederlassungen zu entfernen ,:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Weitere Informationen zu diesem Thema finden Sie unter Alle lokalen Git-Zweige löschen
gone
Marker zu drucken , sollten Sie ihn verwenden -vv
(zweimal ausführlich), während er -a
Ihnen nicht hilft (er listet auch entfernte Zweige auf)