tag repositorio remota rama eliminar crear git bash ubuntu version-control grep

repositorio - Eliminar todas las sucursales locales de git



git fetch (15)

Sigo un proceso de desarrollo en el que creo una nueva sucursal local para cada nueva característica o tarjeta de historia. Cuando termine, fusiono la rama en el maestro y luego presiono.

Lo que suele suceder con el tiempo debido a una combinación de pereza y olvido, es que termino con una gran lista de sucursales locales, algunas de las cuales (como los picos) pueden no haberse fusionado.

Sé cómo enumerar todas mis sucursales locales y cómo eliminar una única sucursal, pero me preguntaba si había un comando git que me permitiera eliminar todas mis sucursales locales.

A continuación se muestra la salida del comando git branch --merged .

user@machine:~/projects/application[master]$ git branch --merged STORY-123-Short-Description STORY-456-Another-Description STORY-789-Blah-Blah * master

Todos los intentos de eliminar las ramas enumeradas con grep -v /* (según las respuestas a continuación) dan como resultado errores:

error: branch ''STORY-123-Short-Description'' not found. error: branch ''STORY-456-Another-Description'' not found. error: branch ''STORY-789-Blah-Blah'' not found.

Estoy usando:
git 1.7.4.1
ubuntu 10.04
GNU bash, versión 4.1.5 (1) -release
GNU grep 2.5.4


Aunque esta no es una solución de línea de comandos, me sorprende que la interfaz gráfica de usuario de Git no haya sido sugerida todavía.

Utilizo la línea de comando el 99% del tiempo, pero en este caso es demasiado lento (de ahí la pregunta original), o no sabes qué estás a punto de eliminar cuando recurres a una manipulación de shell larga pero inteligente.

La IU resuelve este problema ya que puede marcar rápidamente las ramas que desea eliminar y recordar las que desea conservar, sin tener que escribir un comando para cada rama.

Desde la interfaz de usuario, vaya a Rama -> Eliminar y Ctrl + clic en las ramas que desea eliminar para que estén resaltadas. Si desea asegurarse de que se fusionen en una rama (como dev ), en Eliminar solo si se fusiona, establezca la Rama local en dev . De lo contrario, configúrelo en Siempre para ignorar esta comprobación.


El siguiente comando eliminará todas las ramas locales excepto la rama maestra.

rama git | grep -v "maestro" | rama de git de xargs -D

El comando anterior

  1. enumerar todas las ramas
  2. De la lista ignora la rama maestra y toma el resto de las ramas.
  3. eliminar la rama

El subcomando ''git branch -d'' puede eliminar más de una rama. Entonces, simplificando la respuesta de @ sblom pero agregando un xargs crítico:

git branch -D `git branch --merged | grep -v /* | xargs`

o, simplificado aún más a:

git branch --merged | grep -v /* | xargs git branch -D

Es importante destacar que, como lo señaló @AndrewC, se desaconseja el uso de git branch para scripting. Para evitarlo usa algo como:

git for-each-ref --format ''%(refname:short)'' refs/heads | grep -v master | xargs git branch -D

Precaución garantizada en las eliminaciones!

$ mkdir br $ cd br; git init Initialized empty Git repository in /Users/ebg/test/br/.git/ $ touch README; git add README; git commit -m ''First commit'' [master (root-commit) 1d738b5] First commit 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 README $ git branch Story-123-a $ git branch Story-123-b $ git branch Story-123-c $ git branch --merged Story-123-a Story-123-b Story-123-c * master $ git branch --merged | grep -v /* | xargs Story-123-a Story-123-b Story-123-c $ git branch --merged | grep -v /* | xargs git branch -D Deleted branch Story-123-a (was 1d738b5). Deleted branch Story-123-b (was 1d738b5). Deleted branch Story-123-c (was 1d738b5).


Encontré una manera mejor en un comentario sobre este tema en github :

git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d

edición: se agregó la opción sin color y se excluyó la rama estable (agregue otras ramas según sea necesario en su caso)


Escribí un script de shell para eliminar todas las sucursales locales excepto develop

branches=$(git branch | tr -d " *") output="" for branch in $branches do if [[ $branch != "develop" ]]; then output="$output $branch" fi done git branch -d $output


La forma más sencilla de eliminar todas las ramas, pero manteniendo otras como "desarrollar" y "maestro" es la siguiente:

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

muy útil !


Me resultó más fácil usar el editor de texto y la shell.

  1. Escribe git checkout <TAB> en el shell. Mostrará todas las sucursales locales.
  2. Cópialos a un editor de texto, elimina aquellos que necesites guardar.
  3. Reemplace los saltos de línea con espacios. (En SublimeText es super fácil).
  4. Abra el shell, escriba git branch -D <PASTE THE BRANCHES NAMES HERE> .

Eso es.


Ninguna de las respuestas satisfizo mis necesidades por completo, así que aquí vamos:

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

Esto eliminará todas las sucursales locales que se fusionan y comienzan con la feature/ , bugfix/ o hotfix/ . Posteriormente, se elimina el origin remoto en sentido ascendente (es posible que deba ingresar una contraseña).

Trabaja en Git 1.9.5.


No se recomienda analizar la salida de la git branch , y no es una buena respuesta para futuros lectores en .

  1. git branch es lo que se conoce como un comando de porcelana. Los comandos de porcelana no están diseñados para ser analizados a máquina y la salida puede cambiar entre diferentes versiones de Git.
  2. Hay opciones de configuración del usuario que cambian la salida de la git branch de una manera que dificulta el análisis (por ejemplo, la colorización). Si un usuario ha configurado color.branch , obtendrá códigos de control en la salida, esto generará un error: branch ''foo'' not found. Si intentas canalizarlo a otro comando. Puede omitir esto con la bandera --no-color para git branch , pero quién sabe qué otras configuraciones de usuario podrían romper las cosas.
  3. git branch puede hacer otras cosas que son molestas de analizar, como poner un asterisco al lado de la rama actualmente verificada

El mantenedor de git tiene esto que decir acerca de las secuencias de comandos alrededor de la salida de la git branch

Para averiguar qué es la rama actual, los usuarios ocasionales / descuidados pueden haber escrito en torno a la rama de git, lo que está mal. Desaconsejamos activamente el uso de cualquier comando de porcelana, incluyendo git branch, en los scripts, porque la salida del comando está sujeta a cambios para ayudar en el caso de uso del consumo humano.

Las respuestas que sugieren la edición manual de archivos en el directorio .git (como .git / refs / heads) son igualmente problemáticas (los refs pueden estar en .git / packed-refs, o Git puede cambiar su diseño interno en el futuro).

Git proporciona el comando for-each-ref para recuperar una lista de ramas.

Git 2.7.X presentará la opción - --merged para que pueda hacer algo como lo siguiente para encontrar y eliminar todas las ramas fusionadas en HEAD

for mergedBranch in $(git for-each-ref --format ''%(refname:short)'' --merged HEAD refs/heads/) do git branch -d ${mergedBranch} done

Git 2.6.X y versiones anteriores, deberá enumerar todas las sucursales locales y luego probarlas individualmente para ver si se han fusionado (lo que será significativamente más lento y un poco más complicado).

for branch in $(git for-each-ref --format ''%(refname:short)'' refs/heads/) do git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch} done


Para eliminar todas las ramas, excepto la que ha verificado actualmente:

for b in `git branch --merged | grep -v /*`; do git branch -D $b; done

Recomendaría cambiar a git branch -D $b a echo $b las primeras veces para asegurarse de que eliminará las sucursales que pretende.


Por encima de las respuestas funciona bien. Este es otro enfoque cuando tenemos muchas sucursales en repositorio local y tenemos que eliminar muchas, excepto algunas que se encuentran en la máquina local.

La primera git branch todas las sucursales locales.

Para transponer la columna de nombres de rama en una sola fila en el archivo ejecutando un comando de Unix
git branch > sample.txt
Esto lo guardará en el archivo sample.txt . Y correr
awk ''BEGIN { ORS = " " } { print }'' sample.txt
comando en shell. Esto transformará la columna en fila y copiará la lista de nombres de rama en una sola fila.

Y luego correr
git branch -D branch_name(s) .
Esto borrará todas las ramas listadas presentes en local


Sólo una nota, me gustaría actualizar a git 1.7.10. Es posible que esté recibiendo respuestas aquí que no funcionarán en su versión. Mi conjetura es que tendrías que prefijar el nombre de la rama con refs/heads/ .

PRECAUCIÓN, proceda con lo siguiente solo si hizo una copia de su carpeta de trabajo y del directorio .git.

A veces simplemente sigo y borro las ramas que no quiero directamente de .git/refs/heads . Todas estas ramas son archivos de texto que contienen los 40 caracteres sha-1 de la confirmación a la que apuntan. Tendrá información extraña en su .git/config si ha .git/config un seguimiento específico para alguno de ellos. También puede eliminar esas entradas manualmente.


Si no necesita pasar por Git en sí, también puede eliminar heads en .git / refs / heads de forma manual o programática. Lo siguiente debería funcionar con ajustes mínimos bajo Bash:

shopt -s extglob rm -rf .git/refs/heads/!(master)

Esto eliminará todas las sucursales locales, excepto la rama maestra. Debido a que sus sucursales en sentido ascendente se almacenan en .git / refs / remotes , permanecerán intactas.

Si no está utilizando Bash, o desea recibir muchos repositorios Git a la vez, puede hacer algo similar con GNU find:

find . / -path remotes -path logs -prune -o / -wholename /*.git/refs/heads//* /! -name master -print0 | xargs -0 rm -rf

La solución de búsqueda es probablemente más portátil, pero las rutas de poda y los nombres de archivos son difíciles y potencialmente más propensos a errores.


Tuve una situación similar y recientemente encontré útil el siguiente comando.

git branch -D `git branch | awk ''{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }''`

Si quieres mantener múltiples ramas, entonces

git branch -D `git branch | awk ''{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }''`

Espero que esto ayude a alguien.


La siguiente secuencia de comandos elimina las ramas. Úsalo y modifícalo a tu propio riesgo, etc. etc.

Basándome en las otras respuestas de esta pregunta, terminé escribiendo un script de bash rápido para mí. Lo llamé "gitbd" (git branch -D) pero si lo usas, puedes cambiarle el nombre a lo que quieras.

gitbd() { if [ $# -le 1 ] then local branches_to_delete=`git for-each-ref --format ''%(refname:short)'' refs/heads/ | grep "$1"` printf "Matching branches:/n/n$branches_to_delete/n/nDelete? [Y/n] " read -n 1 -r # Immediately continue after getting 1 keypress echo # Move to a new line if [[ ! $REPLY == ''N'' && ! $REPLY == ''n'' ]] then echo $branches_to_delete | xargs git branch -D fi else echo "This command takes one arg (match pattern) or no args (match all)" fi }

Se ofrecerá eliminar cualquier rama que coincida con un argumento de patrón, si se pasa, o todas las ramas locales cuando se llama sin argumentos. También te dará un paso de confirmación, ya que, ya sabes, estamos eliminando cosas, así que eso es bueno.

Es un poco tonto: si no hay ramas que coincidan con el patrón, no se da cuenta.

Un ejemplo de ejecución de salida:

$ gitbd test Matching branches: dummy+test1 dummy+test2 dummy+test3 Delete? [Y/n]