Eliminar ramas remotas antiguas de Git

80

Cuando uso el autocompletado de bash en Git, sigue mostrándome ramas de viejos controles remotos que ya no tengo. Cuando hago un git branch -la, muestra esos viejos controles remotos y ramas, mientras que un git branch -lno lo hace. A ls .git/refs/remotes/también los muestra. Sin embargo, no están presentes en mi .git / config y tampoco se muestran cuando ejecuto git remote show.

Entonces, ¿cómo me deshago de ellos porque mi lista de autocompletar es demasiado larga en este momento?

Ya probé:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

También soy consciente del hecho de que puedo volver a clonar el repositorio, pero eso es solo una trampa ;-)

Alex
fuente
Nota: git remote rmahora (git 2.0.1, junio de 2014) elimine primero las ramas de seguimiento remoto. Eso debería ayudar a evitar limpiar ramas viejas. Vea mi respuesta a continuación
VonC
Aquí está mi otra respuesta: stackoverflow.com/a/44129766/3835843
Arif

Respuestas:

142

Git no elimina las ramas de seguimiento remoto (local) automáticamente si la rama se eliminó en el repositorio remoto. Además, antes de la V2.0.1, las ramas de seguimiento remoto en algunos casos no se eliminaban cuando eliminaba el control remoto de su configuración de git (consulte la respuesta de VonC).

Para eliminar ramas obsoletas de seguimiento remoto (ramas que se eliminaron en el repositorio remoto) para uno de sus repositorios remotos, ejecute

git remote prune <remote>

Para citar la página del manual o git remote:

ciruela pasa

Elimina todas las ramas de seguimiento obsoletas en <nombre>. Estas ramas obsoletas ya se han eliminado del repositorio remoto al que hace referencia <nombre>, pero todavía están disponibles localmente en "remotes / <nombre>".

Con la opción --dry-run, informe qué ramas se podarán, pero no las pode en realidad.

Sin embargo, a partir de su pregunta, parece que lo eliminó manualmente .git/refs/remotes/theoldremote, por lo que Git ya no sabe sobre el repositorio remoto al que pertenecían las ramas de seguimiento remoto. No es así como se supone que debes hacerlo.

La forma normal de eliminar un repositorio remoto es ejecutar

git remote rm <remote>

Esto eliminará el control remoto de su .git/configy eliminará las ramas de seguimiento remoto.

Si simplemente elimina el directorio debajo .git/refs/remotes/, las ramas permanecerán atrás. Luego, deberá eliminarlos manualmente:

git branch -rd <remote>/<branchname>

Necesita la opción -rde eliminar una rama remota.

sleske
fuente
2
No, no es eso. Dice fatal: 'kolichikov' does not appear to be a git repository.
Alex
2
Para la poda automática de ramas remotas en fetch / pull, consulte también: stackoverflow.com/a/18718936/968201
Patrick James McDougle
Si encuentra esto lento, actualice a la versión más reciente de Git (2.0.1+ IIRC) donde esto es fijo (más de 100 veces más rápido).
odinho - Velmont
Nota para podar usuarios: la documentación de Git dice " En la mayoría de los casos, los usuarios deben ejecutar git gc, lo que llama a git prune ". Sin embargo, tenga en cuenta que git gcno es compatible con --dry-run.
JYL
git branch -rd <remote>/<branchname>era lo que estaba buscando. ¡Gracias!
Antoine Colson
16

yo suelo

git push origin :remote_branch

para eliminar una rama del servidor.

git remote prune origin

para eliminar referencias remotas que ya no existen en el servidor

Mert
fuente
No, no es eso. Dicefatal: 'kolichikov' does not appear to be a git repository
Alex
1
Alex, tienes que ejecutar el comando dentro de la carpeta del repositorio, no en tu carpeta de inicio ...
SparK
6

Nota: si bien git remote prune es la respuesta, sepa que, a partir de git 2.0.1 (25 de junio de 2014), git remote rm comienza eliminando las ramas de seguimiento remoto .
Entonces, con suerte, uno no debería tener que limpiar ramas viejas después de un git remote rm.

Ver la confirmación b07bdd3 de Jens Lindström ( jensl)

remote rm: eliminar la configuración remota como la última

Al eliminar un control remoto, elimine las ramas de seguimiento remoto antes de eliminar la configuración remota.
De esta manera, si la operación falla o se cancela mientras se eliminan las ramas de seguimiento remoto, el comando se puede volver a ejecutar para completar la operación .


Pero si es necesario, un simple git fetchpuede ser suficiente, siempre que haya configurado primero:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true
VonC
fuente
Véase también github.com/git/git/commit/…
VonC
4

No empuje nada a una rama para eliminarlo:

git push remote :remote_branch

Está en algún lugar de la documentación, pero no es realmente obvio.

¿O entendí mal tu pregunta?

aragaer
fuente
2
"Está en algún lugar de los documentos, pero no es realmente obvio". tal esgit
mnagel
Por "remoto" me refiero a su nombre de repositorio remoto. Como "origen" o lo que sea. Pero estoy empezando a pensar que se refería a algo más que simplemente eliminar la rama remota.
aragaer
Algo más como esto: stackoverflow.com/questions/1072171/…
aragaer
4

Ok, lo tengo. El problema era que los controles remotos ya no existen, pero sí en algún lugar de la base de datos de git. Volví a agregar los controles remotos, luego lo hice

git remote prune theremote
git remote rm theremote
git gc --prune=now

Después de eso, desaparecen de la lista. De alguna manera no los eliminé correctamente antes, supongo.

Alex
fuente
Intenté todo de varias fuentes, y lo único que funcionó fue volver a agregar el problema remoto y luego eliminarlo. ¡Gracias!
jc00ke
0

Me estaba confundiendo cuando las ramas remotas que se habían eliminado en el lado del servidor todavía aparecían cuando ejecuté:

$ git branch --all

El siguiente comando solucionó esto para mí (en la versión 2.25.0 de git):

$ git remote update --prune
htaccess
fuente