git remote prune: no mostró tantas ramas podadas como esperaba

113

Desde la página del manual:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Así que eliminé un montón de ramas usando

git push origin :staleStuff

y luego corrió

git remote prune origin

Sin embargo, solo se poda una rama local. Algunas de estas ramas fueron creadas por mí, otras por compañeros de trabajo. ¿Esto indica que no estaba rastreando esas ramas correctamente en primer lugar?

Felixyz
fuente
7
para saber lo que van a ser eliminado se puede hacer ramas git remote show originy el aspecto de las ramas marcadasstale
alguien en algún lugar

Respuestas:

189

Cuando lo usa git push origin :staleStuff, se elimina automáticamente origin/staleStuff, por lo que cuando ejecuta git remote prune origin, ha podado alguna rama que alguien más eliminó. Es más probable que sus compañeros de trabajo ahora necesiten correr git prunepara deshacerse de las ramas que ha eliminado.


Entonces, ¿qué git remote prunehace exactamente ? Idea principal: las ramas locales (no las ramas de seguimiento) no se tocan con el git remote prunecomando y deben eliminarse manualmente.

Ahora, un ejemplo del mundo real para una mejor comprensión:

Tiene un repositorio remoto con 2 ramas: mastery feature. Supongamos que está trabajando en ambas ramas, por lo que tiene estas referencias en su repositorio local (se dan los nombres de referencia completos para evitar confusiones):

  • refs/heads/master(nombre corto master)
  • refs/heads/feature(nombre corto feature)
  • refs/remotes/origin/master(nombre corto origin/master)
  • refs/remotes/origin/feature(nombre corto origin/feature)

Ahora, un escenario típico:

  1. Algún otro desarrollador termina todo el trabajo en el feature, lo fusiona mastery elimina la featurerama del repositorio remoto.
  2. De forma predeterminada, cuando lo hace git fetch(o git pull), no se eliminan referencias de su repositorio local, por lo que todavía tiene las 4 referencias.
  3. Decides limpiarlos y correr git remote prune origin.
  4. git detecta que la featurerama ya no existe, por lo que refs/remotes/origin/featurees una rama obsoleta que debe eliminarse.
  5. Ahora tiene 3 referencias, incluidas refs/heads/feature, porque git remote pruneno elimina ninguna refs/heads/*referencia.

Es posible identificar sucursales locales, asociadas con sucursales de seguimiento remoto, por branch.<branch_name>.mergeparámetro de configuración. Este parámetro no es realmente necesario para que nada funcione (probablemente excepto git pull), por lo que podría faltar.

(actualizado con ejemplos e información útil de los comentarios)

max
fuente
Entendí que la situación era: las sucursales todavía están presentes localmente pero eliminadas del repositorio remoto. Ahora quiero eliminar todas las ramas locales que no existen en el control remoto, por lo que ejecuto git prune. Eso es lo que me dice "Estas ramas obsoletas ya se han eliminado del repositorio remoto". ¿Me equivoco?
Felixyz
3
Tiene razón, pero es posible que haya entendido mal el significado de "sucursales locales" en el caso de git prune. Solo las ramas de adentro /refs/remotes/<remote_name>/están sujetas a poda; las ramas de /refs/heads/no se tocarán; debe administrarlas manualmente.
máximo
Ajá, eso es lo que pensé. Entonces, no hay forma de hacer lo que quiero: eliminar automáticamente todas las ramas en las cabezas que están rastreando ramas remotas, verificando si esas ramas remotas se eliminan.
Felixyz
2
No hay un comando incorporado para eso, pero puede escribir ese script usted mismo. Las ramas de seguimiento se pueden identificar por la presencia del branch.<branch_name>.mergeparámetro de configuración.
máximo
Esta respuesta sería mejor si agregara la información de los comentarios en la respuesta en sí para que todos los que vienen aquí y tienen el mismo concepto erróneo que @Felixyz no tengan que ver su respuesta de manera divertida y luego leer los comentarios para finalmente obtener comprensión. .
Akrikos