2010-09-08 7 views
190

me gustaría limpiar mi repositorio local, que tiene un montón de ramas viejas: 3.2 por ejemplo, 3.2.1, 3.2.2, etc.¿Puedes eliminar múltiples ramas en un comando con Git?

que estaba esperando una manera disimulada para eliminar una gran cantidad de ellos a la vez . Dado que en su mayoría siguen una convención de liberación de punto, pensé que tal vez no había un acceso directo a decir:

git branch -D 3.2.* 

y matar a todas las ramas 3.2.x.

Probé ese comando y, por supuesto, no funcionó.

Respuesta

219

No con esa sintaxis. Pero se puede hacer así:

git branch -D 3.2 3.2.1 3.2.2 

Básicamente, rama Git eliminar la rama múltiple para que con una sola invocación. Desafortunadamente no completa el nombre de la rama. Aunque, en bash, que puede hacer:

git branch -D `git branch | grep -E '^3\.2\..*'` 
+1

La finalización de 'git rama -D/-d' funciona bien para mí. Puede que desee actualizar el suyo (tal vez del directorio contrib git.git más reciente). – Cascabel

+13

en lugar de 'git branch | ... 'podrías usar' $ (git para-cada-ref --formato = '% (refname: corto)' refs/heads/3. *) '. Es más largo, lo sé, pero está garantizado que es una salida adecuada, mientras que 'git branch' tiene una salida bonita con cosas como' * 'y' -> '(para symrefs) que pueden arruinarlo en scripts/one-liners. – Cascabel

+1

+1 mucho más simple que la respuesta anterior – nischayn22

111
git branch | cut -c3- | egrep "^3.2" | xargs git branch -D 
^   ^   ^  ^
    |    |    |   |--- create arguments 
    |    |    |    from standard input 
    |    |    | 
    |    |    |---your regexp 
    |    | 
    |    |--- skip asterisk 
    |--- list all 
     local 
     branches 

EDIT:

una versión más segura (sugerido por Jakub Narębski y Jefromi), como salida de git branch no está destinado a ser utilizado en secuencias de comandos:

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

... o el xargs libres:

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

No utilice la salida 'git branch' para la creación de scripts. Use 'git for-each-ref'. –

+1

Para borrar etiquetas con el símbolo @: 'git for-each-ref --format ="% (refname: short) "refs/tags/\ * @ \ * | xargs git tag -d' – thaddeusmt

+1

Gracias por explicarme con el arte ascii. –

22

Uso

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

small tip es que si elimina la última parte del comando "| xargs git branch -D", simplemente generará las ramas correspondientes. Por lo tanto, puede obtener una vista previa de las ramas que se eliminarán –

+1

También agregué un alias para simplificar esto: 'alias grefs = 'git for-each-ref --format ="% (refname: short) "'' entonces puedo hacer 'grefs | grep 'regexpattern' | xargs git branch -D' – angularsen

+0

Loved it. ¡Agradable y simple! –

95

Bueno, en el peor de los casos, usted podría usar:

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

Este es prácticamente el método perfecto para cualquiera que utilice una notación de prefijo estandarizada para nombres de ramas (por ejemplo, "corregir/..." o "función/..."). – Haz

0

Al igual que en Git todas las ramas no son nada por referencias al repositorio git, ¿por qué no acaba de eliminar las ramas van al .git/ref y luego, si queda algo que no sea interesante en el repositorio, se recogerá automáticamente la basura para que no tenga que molestarse.

4

Hice una pequeña función que podría ser útil en función de la respuesta proporcionada por @gawi (arriba).

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

Agregue eso a su .bash_profile y reinicie su terminal. A continuación, puede llamar a la línea de comandos así:

removeBranchesWithPrefix somePrefix 

Nota

lo tengo actualmente configuración para una operación suave Borrar, lo que significa que no va a eliminar las ramas a menos que ya han sido fusionada. Si te gusta vivir al límite, ¡cambia -d a -D y eliminará todo con el prefijo independientemente!

4

Si no está limitado a usar el símbolo del sistema de git, entonces siempre puede ejecutar git gui y usar el elemento de menú Succionar-> Eliminar. Seleccione todas las ramas que desea eliminar y deje que se rasgue.

+0

esto solo le permite borrar sucursales locales aunque –

3

que puede gustarte este pequeño artículo ... Se tira de la lista y solicita la confirmación de cada artículo antes de fin de eliminar todas las selecciones ...

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` 

Uso -D para obligar a las deleciones (como de costumbre).

Para facilitar la lectura, aquí es que la línea interrumpida por la línea ...

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` 

aquí es el enfoque 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 

por último, me gustaría tener esto en mi. 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' 

De esa manera yo sólo puedo decir

gitSelect | xargs git branch -D. 
0

que estás en Windows, puede utilizar PowerShell para hacer esto:

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

reemplazar feature/* con cualquier patrón que te gusta.

+3

grep es un cmdlet no reconocido para mí ... así que he cambiado para este git branch | donde {$ _. Trim(). StartsWith ("error")} | % {git branch -D $ _. Trim()} ¡y funcionó! – Alex

20

Recientemente, yo estaba buscando solución del mismo problema, por fin he encontrado una respuesta y está trabajando muy bien:

  1. abrir el terminal, o equivalente.
  2. Escriba en la rama git | grep "patrón" para una vista previa de las ramas que se eliminarán.
  3. Escriba en la rama git | grep "patrón" | xargs git branch -D

Esta solución es increíble y si quieres una explicación completa de cada comando y cómo está funcionando, se le da here.

-1

Puede eliminar todas las ramas de la eliminación de todas las referencias innecesarias:

rm .git/refs/heads/3.2.*

+1

Downvoted por dos razones: 1. usa un detalle de implementación (el hecho de que las versiones actuales de Git almacenan las ramas como archivos en un directorio determinado). Esto puede cambiar en futuras versiones, haciendo que la respuesta sea inválida. 2. No funciona si el repositorio está ubicado en un [directorio separado] (https://git-scm.com/docs/git-init#git-init---separate-git-dirltgitdirgt). – axiac

+0

Además, esto produce resultados muy inesperados si ejecuta esto en un repositorio empaquetado ('git gc'). No hagas eso. –

7

Puede utilizar git branch --list para enumerar las ramas elegibles

git branch --list '3.2.*' 

Usando git branch -D/-d para eliminar las ramas elegibles. ejemplo un revestimiento:

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