Pregunta Eliminar sucursales locales ya no en el control remoto


¿Hay una forma simple de eliminar todas las sucursales locales que no tienen un equivalente remoto?

Ejemplo:

Sucursales (locales y remotas)

  • dominar
  • origen / maestro
  • origen / error-corregir-a
  • origen / error-corregir-b
  • origen / error-corregir-c

Localmente, solo tengo una rama principal. Ahora necesito trabajar en bug-fix-a, así que lo comprobé, trabajé en él y empujé los cambios al control remoto. A continuación, hago lo mismo con bug-fix-b.

Sucursales (locales y remotas)

  • dominar
  • bug-fix-a
  • bug-fix-b
  • origen / maestro
  • origen / error-corregir-a
  • origen / error-corregir-b
  • origen / error-corregir-c

Ahora tengo sucursales locales dominar, bug-fix-a, bug-fix-b. El mantenedor principal de rama fusionará mis cambios en dominar y borra todas las ramas que ya ha fusionado.

Entonces el estado actual es ahora:

Sucursales (locales y remotas)

  • dominar
  • bug-fix-a
  • bug-fix-b
  • origen / maestro
  • origen / error-corregir-c

Ahora me gustaría llamar a algún comando para eliminar las ramas (en este caso bug-fix-a, bug-fix-b), que ya no están representados en el repositorio remoto.

Sería algo así como el comando existente git remote prune origin, pero más como git local prune origin.


564
2017-10-11 13:37


origen


Respuestas:


git remote prune origin ciruelas pasas de seguimiento no en el control remoto.

git branch --merged enumera las ramas que se han fusionado en la rama actual.

xargs git branch -d borra las ramas enumeradas en la entrada estándar.

Tenga cuidado al eliminar las ramas enumeradas por git branch --merged. La lista podría incluir master u otras ramas que prefiera no eliminar.

Para tener la oportunidad de editar la lista antes de eliminar las sucursales, puede hacer lo siguiente en una línea:

git branch --merged >/tmp/merged-branches && vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches


623
2018-02-11 20:56



Después del comando

git fetch -p

elimina las referencias remotas, cuando ejecuta

git branch -vv

mostrará 'ido' como el estado remoto. Por ejemplo,

$ git branch -vv
  master                 b900de9 [origin/master: behind 4] Fixed bug
  release/v3.8           fdd2f4e [origin/release/v3.8: behind 2] Fixed bug
  release/v3.9           0d680d0 [origin/release/v3.9: behind 2] Updated comments
  bug/1234               57379e4 [origin/bug/1234: gone] Fixed bug

Para que pueda escribir una secuencia de comandos simple para eliminar las sucursales locales que se han ido remotos:

git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done

280
2017-11-05 15:06



La mayoría de estas respuestas no responden a la pregunta original. Hice un montón de excavaciones y esta fue la solución más limpia que encontré. Aquí hay una versión un poco más completa de esa respuesta:

  1. Verifica tu sucursal predeterminada. Generalmente git checkout master
  2. correr git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

Explicación:

Funciona al eliminar las ramas de seguimiento y luego eliminar las locales que muestran que se han "ido" en git branch -vv.

Notas:

Si su idioma está configurado en otro idioma que no sea inglés, deberá cambiar gone a la palabra apropiada. Las ramas que son locales solamente no se tocarán. Las ramas que se han eliminado en el control remoto pero no se fusionaron mostrarán una notificación pero no se eliminarán en local. Si quieres eliminar esos también cambia -d a -D.


180
2017-07-15 19:58



Parece que la solución está aquí - https://stackoverflow.com/a/1072178/133986

En breve, git remote prune hace la magia


54
2018-01-07 13:10



Encontré la respuesta aquí: ¿Cómo puedo eliminar todas las ramas de git que se han fusionado?

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

Asegúrate de mantener el maestro

Puedes asegurarte de que master, o cualquier otra rama para el caso, no se elimina al agregar otra grep después de la primera. En ese caso irías:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Si quisiéramos mantener master, develop y staging por ejemplo, iríamos:

git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d

Hacer esto un alias

Dado que es un poco largo, es posible que desee agregar un alias a su .zshrco .bashrc. El mío se llama gbpurge (para git branches purge)

alias gbpurge='git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d'

Luego recarga tu .bashrco .zshrc:

. ~/.bashrc

o

. ~/.zshrc

42
2017-08-23 12:06



Elimine todas las ramas que se fusionaron en maestra, pero no intente eliminar el maestro en sí:

git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)

o agrega un alias:

alias gitcleanlocal="git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)"

Explicación:

git checkout master  checkout rama principal

git pull origin master  asegurar que la sucursal local tenga fusionados todos los cambios remotos

git fetch -p eliminar referencias a sucursales remotas que se han eliminado

git branch -d $(git branch master --merged | grep master -v)  elimine todas las ramas que se fusionaron en maestra, pero no intente eliminar el maestro


25
2017-12-10 23:14



Normalmente, no respondería una pregunta que ya tiene 16 respuestas, pero todas las otras respuestas son incorrectas, y la respuesta correcta es muy simple. La pregunta dice: "¿Existe una forma simple de eliminar todas las sucursales locales que no tienen un equivalente remoto?" - pero la verdadera intención es claramente "... eliminar todo rastreo ramas cuyo equivalente remoto ya no existe ".

La respuesta correcta es que esta pregunta es: No.

(Tomo "simple" para significar "no frágil, no peligroso y no depender de herramientas que no todos los lectores tendrán").

Si dudas de mí, lee las otras respuestas cuidadosamente. Hay algunos que son simples, pero no hacen lo que se les pidió. Y hay muchos que hacen lo que se pidió, pero no son simples: todos se basan en analizar la salida de Git (y la salida de porcelana para arrancar en la mayoría de los casos) a través de comandos de manipulación de texto o lenguajes de scripting, que pueden no estar presentes en todos los sistemas .

Otras lecturas: https://stackoverflow.com/a/20107184/587365 y https://stackoverflow.com/a/26152574/587365

Si desea hacer esto de manera segura, para el caso de uso en la pregunta (ramas de seguimiento de recopilación de basura que se han eliminado en el servidor pero aún existen como sucursales locales) y solo con comandos de alto nivel de Git, debe

  • git fetch --prune (o git fetch -p, que es un alias, o git prune remote origin que hace lo mismo sin ir a buscar, y probablemente no es lo que quieres la mayoría del tiempo).
  • Tenga en cuenta las ramas remotas que se informan como eliminadas. O, para encontrarlos más adelante, git branch -v (cualquier rama de rastreo huérfana se marcará como "[desaparecido]").
  • git branch -d [branch_name] en cada rama de rastreo huérfano

19
2017-12-22 09:54



git fetch -p

Esto eliminará todas las ramas que no se rastrean de forma remota.


15
2017-10-17 15:20



No creo que haya un comando incorporado para hacer esto, pero es seguro hacer lo siguiente:

git checkout master
git branch -d bug-fix-a

Cuando usas -d, git se negará a eliminar la rama a menos que esté completamente fusionada en HEAD o su rama de seguimiento remoto aguas arriba. Por lo tanto, siempre puedes recorrer el resultado de git for-each-ref e intenta eliminar cada rama. El problema con ese enfoque es que sospecho que probablemente no quieras bug-fix-d para ser eliminado simplemente porque origin/bug-fix-d contiene su historia En su lugar, podría crear un script como el siguiente:

#!/bin/sh

git checkout master &&
for r in $(git for-each-ref refs/heads --format='%(refname:short)')
do
  if [ x$(git merge-base master "$r") = x$(git rev-parse --verify "$r") ]
  then
    if [ "$r" != "master" ]
    then
      git branch -d "$r"
    fi
  fi
done

Advertencia: no he probado esta secuencia de comandos, use solo con cuidado ...


10
2017-10-11 14:08



Esto eliminará toda la referencia local master fusionada local excepto la fusionada y la que se está usando actualmente:

git branch --merged | grep -v "*" | grep -v "master" | xargs git branch -d

Y esto eliminará todas las ramas que ya se hayan eliminado del repositorio remoto al que hace referencia "origen", pero todavía están disponibles localmente en"controles remotos / origen".

git remote prune origin

10
2018-02-27 19:53



Podría ser útil para algunos, una línea simple para borrar todas las ramas locales, excepto la maestra y desarrollar

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

9
2018-02-28 11:27