Voglio eliminare tutti i rami che vengono elencati nell'output di ...
$ git branch
... ma mantenendo il ramo attuale, in un solo passaggio . È possibile? Se é cosi, come?
Voglio eliminare tutti i rami che vengono elencati nell'output di ...
$ git branch
... ma mantenendo il ramo attuale, in un solo passaggio . È possibile? Se é cosi, come?
Risposte:
Sulla base della risposta di @pankijs, ho creato due alias git:
[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"
Da aggiungere ~/.gitconfig
E, come ha sottolineato @torek:
Nota che le lettere minuscole
-d
non eliminano un ramo "non completamente unito" (vedi la documentazione). L'utilizzo-D
cancellerà tali branch , anche se questo causa la "perdita" dei commit; usalo con molta attenzione , poiché elimina anche i reflog di branch, in modo che anche la solita roba di "ripristino da eliminazione accidentale" non funzioni.
Fondamentalmente, non utilizzare mai la -force
versione se non sei sicuro al 300% di non perdere nulla di importante. Perché è perso per sempre .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
cancellerà tutti i rami eccetto il master (sostituisci il master con il ramo che vuoi mantenere, ma poi cancellerà il master)
grep -v ^*
.
master-copy
, ad esempio
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
prima (passa al ramo che vuoi mantenere> ex : master ):
git checkout master
secondo ( assicurati di essere sul master )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(o -D
) consente più nomi di rami, ma è un po 'complicato fornire automaticamente "tutti i rami locali escluso quello in cui mi trovo ora" senza scrivere almeno un po' di codice.
Il metodo "migliore" (formalmente corretto) è quello di utilizzare git for-each-ref
per ottenere i nomi dei rami:
git for-each-ref --format '%(refname:short)' refs/heads
ma poi è ancora più difficile capire in quale ramo ti trovi ( git symbolic-ref HEAD
è il metodo "formalmente corretto" per questo, se vuoi scrivere uno script di fantasia).
Più comodamente, puoi usare git branch
, che stampa i nomi dei tuoi rami locali preceduti da due spazi o (per il ramo corrente) da un asterisco *
. Quindi, esegui questo passaggio per rimuovere la *
versione e ti rimangono i nomi dei rami separati da spazi, che puoi quindi passare a git branch -d
:
git branch -d $(git branch | grep -v '^*')
o:
git branch | grep -v '^*' | xargs git branch -d
Nota che le lettere minuscole -d
non eliminano un ramo "non completamente unito" (vedi la documentazione). L'utilizzo -D
cancellerà tali branch, anche se questo causa la "perdita" dei commit; usalo con molta attenzione, poiché elimina anche i reflog di branch, in modo che anche la solita roba di "ripristino da eliminazione accidentale" non funzioni.
git branch -D $(git branch | grep -v '^*')
, se vuoi eliminare quei rami che sono stati uniti.
Per rimuovere tutti i rami uniti (eccetto quelli correnti -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
inoltre ho creato tale comando per la pulizia completa del repository:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
preso da qui .
Elimina tutti i rami tranne uno specifico :
git branch | grep -v "branch name" | xargs git branch -D
Elimina tutti i rami locali tranne lo sviluppo e il master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Per Windows, in Powershell usa:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Elimina localmente tutti i rami uniti:
git branch -D `git branch --merged | grep -v \* | xargs`
Elimina tutti i rami tranne uno specifico :
git branch | grep -v "branch name" | xargs git branch -D
Elimina tutti i rami locali tranne lo sviluppo e il master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Una volta ho creato questo costrutto per il mio ambiente Windows. Forse aiuterà qualcun altro. Durante l'esecuzione, il master e il ramo corrente non vengono eliminati . Tutti gli altri rami uniti verranno eliminati indipendentemente.
@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
Quindi vedo molti nomi di rami codificati qui ... E penso che la mia risposta qui sia più accurata per la parte "ramo corrente" della domanda pur mantenendola su una riga e leggibile per i neofiti come me. Giusto per mettere il merito dove è dovuto, la risposta è piuttosto ovviamente basata anche sulla risposta di @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
e ho anche l'alias su una riga nel mio .bash_aliases in Debian.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Anche se penso che alcune funzionalità di bash debbano essere abilitate affinché il comando secondario venga eseguito su alcune righe di comando)
Lo uso perché riesco a essere più selettivo in ciò che non voglio eliminare. Questo comando seguente rimuove ogni ramo tranne master, sviluppo e il ramo corrente.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Quindi ho messo questo nel mio file ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO, il modo più sicuro per rimuovere le filiali locali è:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Inoltre, maggiori informazioni relative a questo argomento puoi trovare Elimina tutti i rami git locali
gone
marker dovresti usare -vv
(verbose due volte), mentre -a
non ti aiuta (elenca anche rami remoti)