Cómo eliminar sucursales cuyo nombre coincida con un determinado patrón

4 minutos de lectura

Avatar de usuario de Nirmalya Ghosh
Nirmalya Ghosh

¿Cómo puedo eliminar ramas en git que comienzan con la letra ‘o’?

Supongamos que tengo una lista de sucursales como la siguiente:

origin_alpha
origin_beta
origin_gamma
alpha
beta
gamma

quiero borrar las ramas origen_alfa, origen_beta y origen_gamma.

  • Posible duplicado de ¿Puedes eliminar varias ramas en un solo comando con Git?

    – cmbuckley

    10 de noviembre de 2015 a las 13:42

  • No conozco ninguna limitación que le impida eliminar esas ramas como lo haría con cualquier otra rama: git branch -d origin_alpha

    – kvdv

    10 de noviembre de 2015 a las 13:42


  • @kvdv Gracias por tu respuesta. Supongamos que tengo 50 ramas que comienzan con la letra ‘o’, entonces no es conveniente eliminar manualmente todas esas ramas. De ahí la pregunta.

    – Nirmalya Ghosh

    10 de noviembre de 2015 a las 13:46

  • @cmbuckley Gracias por tu respuesta. Quería eliminar solo aquellas ramas que comienzan con una letra definida. Entonces, mi pregunta es diferente a la que mencionaste.

    – Nirmalya Ghosh

    10 de noviembre de 2015 a las 13:47

  • @NirmalyaGhosh no, es lo mismo, pero el partido es o* en lugar de 3.2*. Consulte la respuesta stackoverflow.com/a/28614187/283078.

    – cmbuckley

    10 de noviembre de 2015 a las 13:49

avatar de usuario de hek2mgl
hek2mgl

Actualizar el -r opción a xargs es un complemento de GNU. A menos que uses xargs de GNU findutils podría no funcionar. Puede omitirlo, pero eso genera un error si la entrada canalizada a xargs está vacía.


Puedes usar git branch --list <pattern> y canalizar su salida a xargs git branch -d:

git branch --list 'o*' | xargs -r git branch -d

Por cierto, hay un problema menor con el código anterior. Si actualmente ha consultado una de las sucursales que comienza con o la salida de git branch --list 'o*' se vería así:

* origin_master
origin_test
o_what_a_branch

Tenga en cuenta el asterisco * delante del nombre de la rama actual.

Si bien no puede eliminar la rama actual de todos modos, esto lleva al hecho de que xargs también pasa * a git branch delete.

Como digo es solo un error cosmético, pero si quieres evitarlo usa:

git branch --list 'o*' | sed 's/^* //' | xargs -r git branch -d

  • Esto no funcionará si está en una de esas ramas, ya que su salida contendrá el asterisco resaltado. Consulte la respuesta stackoverflow.com/a/3670560/283078.

    – cmbuckley

    10 de noviembre de 2015 a las 13:51


  • Cambié a maestro y apliqué este código. Resolvió mi problema. Gracias.

    – Nirmalya Ghosh

    10 de noviembre de 2015 a las 13:51

  • @cmbuckley git branch -d <branch> tampoco funcionaría si estás en esa rama. 😉 Es por eso que he ignorado eso.

    – hek2mgl

    10 de noviembre de 2015 a las 13:53


  • Acabo de probar en una Mac: xargs no acepta -r (illegal option -- r) pero funcionó sin él para el propósito deseado.

    –Amy Pellegrini

    22 de agosto de 2018 a las 10:55


  • FYI Las comillas simples me matan en Windows ahora mismo git branch --list 'hotfix' no muestra nada pero git branch --list "hotfix" Hace el truco

    – PandaWood

    6 oct 2020 a las 23:49

avatar de usuario de lzzluca
lzzluca

Otra forma podría ser esta:

git branch -d $(git branch | grep yourSearchPattern)

a mí me parece más intuitivo porque grep es algo que uso a diario.

También puede hacer un alias de él (o también de cualquier solución sugerida aquí), verifique, por ejemplo, aquí cómo pasar argumentos a un alias:
http://www.cyberciti.biz/faq/linux-unix-pass-argument-to-alias-command/

PD: en su caso específico, yourSearchPattern podría ser el origen:

git branch -d $(git branch | grep origin)

PPS como siguiente paso, también sería bueno hacer que el proceso de eliminación sea más detallado, por ejemplo, sería bueno que tenga que confirmar la eliminación para cada rama. Pero creo que eso supera la pregunta…

  • Estoy en Windows en este momento, y aunque tengo el conjunto completo de comandos de Unix, como grep, su sugerencia aquí, por ejemplo git branch -d $(git branch | grep hotfix) falla con error: branch '$(git' not found

    – PandaWood

    23 de julio de 2018 a las 0:27


  • A primera vista: es $() Win lo reconoce correctamente? parece que git está tratando de eliminar la rama $(git en lugar de reemplazarlo con la salida del comando

    – lzzluca

    24 de julio de 2018 a las 12:05

  • Sería genial ver la elaboración de lo que hace la primera línea de código después de “-d”.

    – Eduardo

    30 de julio de 2018 a las 12:10

Avatar de usuario de Austin pb
austin pb

git branch -D $(git branch --list 'regex_here')

Ejemplo: \
git branch -D $(git branch --list 'aputhen/*')

Elimina todas las sucursales cuyo nombre comienza con aputhen/.

Agregar el script que uso en PowerShell (Windows)

Foreach ($branch in (git branch --list | findstr user)) { git branch -D $branch.trim() }

Llegar tarde a la fiesta, pero otra forma de hacerlo es

git branch -d `git branch | grep substring`

y para la pregunta actual

git branch -d `git branch | grep origin`

Esto eliminará todas las sucursales cuyos nombres contengan origen.

¿Ha sido útil esta solución?