Sigo un proceso de desarrollo en el que creo una nueva sucursal local para cada nueva característica o tarjeta de historia. Cuando termino fusiono la rama en maestra y luego empujo.
Lo que tiende a suceder con el tiempo debido a una combinación de pereza u olvido es que termino con una gran lista de sucursales locales, algunas de las cuales (como picos) pueden no haberse fusionado.
Sé cómo enumerar todas mis ramas locales y sé cómo eliminar una sola rama, pero me preguntaba si había un comando git que me permitiera eliminar todas mis ramas locales.
A continuación se muestra la salida del git branch --merged
comando.
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 ramas enumeradas con grep -v \*
(según las respuestas a continuación) resultan en 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
Respuestas:
El subcomando 'git branch -d' puede eliminar más de una rama. Entonces, simplificando la respuesta de @ sblom pero agregando un xargs crítico:
o, simplificado aún más a:
Es importante destacar que, como señaló @AndrewC,
git branch
se desaconseja el uso de secuencias de comandos. Para evitarlo usa algo como:¡Precaución garantizada en eliminaciones!
fuente
error:branch 'STORY-123-Short-Description' not found.
para cada una de las ramas enumeradas.error:branch 'STORY-123-Short-Description' not found.
error, esto probablemente se deba a la configuración de color de git. Esto funcionó para mí (tenga en cuenta la--no-color
opción):git branch --no-color --merged | grep -v \* | xargs git branch -D
Encontré una mejor manera en un comentario sobre este problema en github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
editar: se agregó la opción sin color y se excluyó la rama estable (agregue otras ramas según sea necesario en su caso)
fuente
error: branch 'my-branch-name' not found.
para cada rama. Usando git versión 1.8.3.4 (Apple Git-47). ¿Alguna idea de por qué?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
git branch
No se recomienda analizar la salida de , y no es una buena respuesta para futuros lectores en Stack Overflow.git branch
es lo que se conoce como un comando de porcelana. Los comandos de porcelana no están diseñados para analizarse a máquina y la salida puede cambiar entre diferentes versiones de Git.git branch
una manera que dificulta el análisis (por ejemplo, la coloración). Si un usuario lo ha configuradocolor.branch
, obtendrá códigos de control en la salida, esto lo conduciráerror: branch 'foo' not found.
si intenta canalizarlo a otro comando. Puede omitir esto con el--no-color
indicadorgit branch
, pero quién sabe qué otras configuraciones de usuario pueden romper las cosas.git branch
puede hacer otras cosas que son molestas de analizar, como poner un asterisco al lado de la rama actualmente desprotegidaEl mantenedor de git tiene esto que decir sobre las secuencias de comandos alrededor de la
git branch
salidaLas respuestas que sugieren editar archivos manualmente en el
.git
directorio (como .git / refs / heads) son igualmente problemáticas (las referencias pueden estar en .git / package-refs en su lugar, o Git puede cambiar su diseño interno en el futuro).Git proporciona el
for-each-ref
comando para recuperar una lista de ramas.Git 2.7.X presentará la
--merged
opción para que pueda hacer algo como lo siguiente para encontrar y eliminar todas las ramas fusionadas enHEAD
Git 2.6.X y 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).
fuente
git branch --no-color 2>/dev/null
?git branch
es un comando de porcelana, y no hay garantía de que el resultado no cambie en alguna versión futura de git.La forma más sencilla de eliminar todas las ramas pero manteniendo otras como "desarrollar" y "maestro" es la siguiente:
muy útil !
fuente
Para eliminar todas las ramas, excepto la que actualmente ha extraído:
Recomendaría cambiar
git branch -D $b
a unaecho $b
las primeras veces para asegurarse de que elimine las ramas que desea.fuente
error:branch 'a_branch_name' not found.
puedo ver lo que estás tratando de hacer y he estado jugando con el comando, pero por alguna razón a git no parece gustarle los nombres de las ramas suministrados ...git branch --merged
STORY-123-Short-Description
git branch --merged
, obtienes una lista con uno de esos en cada línea?error:branch 'a_branch_name' not found.
? ¿O se queja de uno de los nombres de rama de sugit branch
salida anterior?El siguiente comando eliminará todas las ramas locales excepto la rama maestra.
El comando anterior
fuente
git branch | grep -v "master" | xargs git branch -d
primero para no eliminar ramas no fusionadas, solo para estar seguro. Pero buena respuesta!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Solo una nota, me actualizaría a git 1.7.10. Es posible que obtenga respuestas aquí que no funcionarán en su versión. Supongo que tendrías que anteponer el nombre de la rama
refs/heads/
.PRECAUCIÓN, continúe con lo siguiente solo si realizó una copia de su carpeta de trabajo y directorio .git.
A veces simplemente continúo y borro las ramas de las que no quiero directamente
.git/refs/heads
. Todas estas ramas son archivos de texto que contienen los 40 caracteres sha-1 del commit al que apuntan. Tendrá información extraña en su.git/config
si tuviera configurado un seguimiento específico para cualquiera de ellos. También puede eliminar esas entradas manualmente.fuente
Pruebe el siguiente comando de shell:
Explicación:
git branch | grep -v "master"
comandoxargs
comandoxargs git branch -D
fuente
Para eliminar todas las sucursales locales en Linux, excepto la que está en
fuente
Me resultó más fácil usar solo el editor de texto y el shell.
git checkout <TAB>
en concha. Mostrará todas las sucursales locales.git branch -D <PASTE THE BRANCHES NAMES HERE>
.Eso es.
fuente
Tuve una situación similar y recientemente encontré útil el siguiente comando.
Si desea mantener varias ramas, entonces
Espero que esto ayude a alguien.
fuente
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
realidad, creo que los tenía originalmente, pero se perdieron en el formato SO.Desde la línea de comandos de Windows, elimine todo excepto la rama actual desprotegida usando:
fuente
Si no necesita pasar por Git, también puede eliminar los encabezados en .git / refs / heads de forma manual o programática. Lo siguiente debería funcionar con ajustes mínimos en Bash:
Esto eliminará todas las sucursales locales, excepto su rama maestra. Dado que sus ramas ascendentes se almacenan en .git / refs / remotes , permanecerán intactas.
Si no está utilizando Bash, o desea recurrir muchos repositorios Git a la vez, puede hacer algo similar con GNU find:
La solución de búsqueda es probablemente más portátil, pero las rutas de poda y los nombres de archivo son complicados y potencialmente más propensos a errores.
fuente
Ninguna de las respuestas satisfizo completamente mis necesidades, así que aquí vamos:
Esto eliminará todas las sucursales locales que se fusionen y comiencen con
feature/
,bugfix/
ohotfix/
. Luego el control remoto aguas arribaorigin
(es posible que deba ingresar una contraseña).Funciona en Git 1.9.5.
fuente
Basado en una combinación de una serie de respuestas aquí: si desea mantener todas las ramas que existen en forma remota pero eliminar el resto , el siguiente trazador de líneas hará el truco:
fuente
Aunque esta no es una solución de línea de comando, me sorprende que la GUI de Git aún no se haya sugerido.
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 lo que estás a punto de eliminar cuando recurres a una manipulación de shell larga pero inteligente.
La interfaz de usuario 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 + Haga clic en las ramas que desea eliminar para que se resalten. Si desea asegurarse de que se fusionen en una rama (como
dev
), en Eliminar solo si se fusionó en establecer la rama local endev
. De lo contrario, configúrelo en Siempre para ignorar esta comprobación.fuente
Para powershell, esto funcionará:
fuente
El siguiente script elimina ramas. Úselo y modifíquelo bajo su propio riesgo, etc. etc.
Basado en las otras respuestas en 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.
Ofrecerá eliminar cualquier rama que coincida con un argumento de patrón, si se pasa, o todas las ramas locales cuando se llame 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 dará cuenta.
Un ejemplo de salida de ejecución:
fuente
Escribí un script de shell para eliminar todas las ramas locales excepto
develop
fuente
Las respuestas anteriores funcionan bien. Aquí hay otro enfoque cuando tenemos muchas ramas en el repositorio local y tenemos que eliminar muchas ramas, excepto algunas que se encuentran en la máquina local.
primero
git branch
se enumerarán todas las sucursales locales.Para transponer la columna de nombres de rama en una sola fila en el archivo ejecutando un comando 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 corre
git branch -D branch_name(s)
.Esto eliminará todas las ramas enumeradas presentes en local
fuente
La forma más pragmática: asegúrese de no tener un trabajo no comprometido
master
, confirme / envíe si es necesario, clone una copia nueva del repositorio y elimine el antiguo.fuente
Para este propósito, puedes usar git-extras
fuente
No tengo grep u otro Unix en mi caja, pero esto funcionó desde el terminal de VSCode:
git branch -d $(git branch).trim()
Utilizo la minúscula d para que no elimine las ramas no fusionadas.
También estaba en master cuando lo hice, por lo
* master
que no existe, por lo que no intentó eliminar master.fuente
master
está activado, este comando BORRARÁmaster
.Asegúrate de hacer esto primero
Una vez que tenga toda la información de las sucursales remotas, use el siguiente comando para eliminar cada una de las ramas excepto la maestra
fuente