¿Cómo eliminar las ramas de seguimiento locales que ya no existen remotamente?
Con git remote prune origin
puedo eliminar las sucursales locales que ya no están en el control remoto.
Pero también quiero eliminar las ramas locales que se crearon a partir de esas ramas remotas (sería bueno verificar si no están fusionadas).
¿Cómo puedo hacer esto?
Después de la poda, puede obtener la lista de sucursales remotas con git branch -r
. La lista de sucursales con su sucursal de seguimiento remoto se puede recuperar con git branch -vv
. Entonces, usando estas dos listas puedes encontrar las ramas de seguimiento remoto que no están en la lista de remotos.
Esta línea debería funcionar (requiere bash
or zsh
, no funcionará con el shell Bourne estándar):
git fetch -p ; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
Esta cadena obtiene la lista de sucursales remotas y la pasa a egrep
través de la entrada estándar. Y filtra las ramas que tienen una rama de seguimiento remoto (usando git branch -vv
y filtrando las que tienen origin
) y luego obtiene la primera columna de esa salida, que será el nombre de la rama. Finalmente, pasando todos los nombres de las ramas al comando de eliminación de ramas.
Dado que está usando la -d
opción, no eliminará las ramas que no se hayan fusionado con la rama en la que se encuentra cuando ejecuta este comando.
Si desea eliminar todas las ramas locales que ya están fusionadas en la maestra, puede usar el siguiente comando:
git branch --merged master | grep -v '^[ *]*master$' | xargs -d'\n' git branch -d
Si está utilizando main
como rama maestra, debe modificar el comando en consecuencia:
git branch --merged main | grep -v '^[ *]*main$' | xargs -d'\n' git branch -d
Más información .
NOTA: xargs
-d'\n'
el parámetro se utiliza para permitir la eliminación adecuada de ramas con un apóstrofo en el nombre; consulte https://unix.stackexchange.com/questions/38148/why-does-xargs-strip-quotes-from-input .