Puoi eliminare più rami in un comando con Git?

Mi piacerebbe ripulire il mio repository locale, che ha un sacco di vecchi rami: per esempio 3.2 , 3.2.1 , 3.2.2 , ecc.

Speravo in un modo subdolo per rimuoverli tutti in una volta. Dato che per lo più seguono una convenzione di rilascio di punti, ho pensato che forse c’era una scorciatoia da dire:

 git branch -D 3.2.* 

e uccidi tutti i rami 3.2.x.

Ho provato questo comando e, ovviamente, non ha funzionato.

Non con quella syntax. Ma puoi farlo in questo modo:

 git branch -D 3.2 3.2.1 3.2.2 

Fondamentalmente, git branch cancellerà più branch per te con una singola chiamata. Sfortunatamente non esegue il completamento del nome del ramo. Sebbene, in bash, puoi fare:

 git branch -D `git branch | grep -E '^3\.2\..*'` 
 git branch | cut -c3- | egrep "^3.2" | xargs git branch -D ^ ^ ^ ^ | | | |--- create arguments | | | from standard input | | | | | |---your regexp | | | |--- skip asterisk |--- list all local branches 

MODIFICARE:

Una versione più sicura (suggerita da Jakub Narębski e Jefromi), poiché l’output del ramo git non è pensato per essere utilizzato negli script:

 git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D 

… o senza xarg:

 git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*` 

Bene, nel peggiore dei casi, potresti usare:

 git branch | grep '3\.2' | xargs git branch -d 

È ansible utilizzare git branch –list per elencare i rami idonei e utilizzare git branch -D / -d per rimuovere i rami idonei.

Un esempio di linea:

 git branch -d `git branch --list '3.2.*'` 

Recentemente, stavo cercando la soluzione dello stesso problema, finalmente ho trovato una risposta e sta funzionando molto bene:

  1. Aprire il terminale o equivalente.
  2. Digitare il ramo git | grep “pattern” per un’anteprima dei rami che verranno cancellati.
  3. Digitare il ramo git | grep “pattern” | xargs git branch -D

Questa soluzione è fantastica e se vuoi una spiegazione completa di ogni comando e di come funziona, è qui indicato.

Uso

 git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' | xargs git branch -D 

Ho fatto una piccola funzione che potrebbe essere utile in base alla risposta fornita da @gawi (sopra).

 removeBranchesWithPrefix() { git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d } 

Aggiungilo al tuo .bash_profile e riavvia il tuo terminale. Quindi puoi chiamare da linea di comando in questo modo:

 removeBranchesWithPrefix somePrefix 

Nota

L’ho attualmente impostato per un soft delete, il che significa che non eliminerà i rami a meno che non siano già stati uniti. Se ti piace vivere ai margini, cambia -d a -D e cancellerà tutto con il prefisso a prescindere!

Se non sei limitato a utilizzare il prompt dei comandi git, puoi sempre eseguire git gui e utilizzare la voce di menu Branch-> Delete. Seleziona tutti i rami che vuoi eliminare e lasciali strappare.

Potresti gradire questo piccolo object … Estrae l’elenco e chiede la conferma di ciascun elemento prima di eliminare definitivamente tutte le selezioni …

 git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer  

Usa -D per forzare le eliminazioni (come al solito).

Per la leggibilità, ecco quella suddivisa riga per riga ...

 git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer  

ecco l'approccio xargs ...

 git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer  

infine, mi piace avere questo nel mio .bashrc

 alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer  

In questo modo posso solo dire

 gitSelect | xargs git branch -D. 

Forse lo troverai utile:

Se si desidera rimuovere tutti i rami che non sono ad esempio “master”, “foo” e “bar”

 git branch -D `git branch | grep -vE 'master|foo|bar'` 

grep -v ‘something’ è un matcher con inversione.

Per le anime pure che usano PowerShell qui il piccolo script git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })

Come in Git tutti i rami non sono nulla con i riferimenti al repository git, perché non basta eliminare i branch che vanno a .git/ref e quindi se qualcosa viene lasciato fuori che non è interessante nel repository sarà automaticamente garbage collection così non devi preoccuparti

Io sono su Windows, puoi usare PowerShell per fare questo:

  git branch | grep 'feature/*' |% { git branch -D $_.trim() } 

sostituisci la feature/* con qualsiasi modello che ti piace.

Puoi usare questo comando: git branch -D $(printf "%s\n" $(git branch) | grep '3.2')

Puoi usare git gui per eliminare più rami contemporaneamente. Da Prompt dei comandi / Bash -> git gui -> Remoto -> Elimina ramo … -> seleziona i rami remoti che vuoi rimuovere -> Elimina.

Puoi rimuovere tutti i rami rimuovendo tutti i riferimenti non necessari:

rm .git/refs/heads/3.2.*