tutorial Puoi eliminare più rami in un comando con Git?




guida git pdf (12)

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.


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


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!


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.


Non con quella sintassi. 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\..*'`

Bene, nel peggiore dei casi, potresti usare:

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

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, è here indicato.


Uso

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

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 utilizzare git branch --list per elencare i rami idonei

git branch --list '3.2.*'

Utilizzando git branch -D / -d per rimuovere i rami idonei. Un esempio di linea:

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

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

rm .git/refs/heads/3.2.*


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 oggetto ... 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 </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

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 </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

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 </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

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 </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

In questo modo posso solo dire

gitSelect | xargs git branch -D.




git