2010-10-28 3 views
107

Desde la página del manual:ciruela remoto GIT - no se presentó el mayor número de ramas podadas como esperaba

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 eliminan un montón de ramas usando

git push origin :staleStuff 

y luego ejecutó

git remote prune origin 

Sin embargo, solo uno sola rama local fue podada. Algunas de estas ramas fueron creadas por mí, algunas por compañeros de trabajo. ¿Esto indica que no estaba rastreando esas ramas correctamente en primer lugar?

+6

para averiguar lo que van a ser eliminado se puede hacer 'git show de origen controlado a distancia y buscar cualquier ramas marcadas ramas 'stale' –

Respuesta

180

Cuando usa git push origin :staleStuff, elimina automáticamente origin/staleStuff, por lo que cuando ejecutó git remote prune origin, ha borrado alguna rama que fue eliminada por otra persona. Es más probable que sus compañeros de trabajo ahora necesiten ejecutar git prune para deshacerse de las ramas que ha eliminado.


¿Qué exactamente git remote prune hace? Idea principal: las ramas locales (que no rastrean las ramas) no se tocan con el comando git remote prune y deben eliminarse manualmente.

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

Usted tiene un repositorio remoto con 2 ramas: master y feature. Vamos a suponer que usted está trabajando en ambas ramas, por lo que como resultado usted tiene estas referencias en su repositorio local (se dan los nombres de referencia completo para evitar cualquier confusión):

  • 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 la feature, se funde en master y elimina feature rama del repositorio remoto.
  2. De forma predeterminada, cuando hace git fetch (o git pull), no se eliminan las referencias de su repositorio local, por lo que todavía tiene todas esas 4 referencias.
  3. Usted decide limpiarlos, y ejecutar git remote prune origin.
  4. git detectar que feature rama ya no existe, por lo refs/remotes/origin/feature es una rancio rama que debe ser eliminado.
  5. Ahora tiene 3 referencias, incluyendo refs/heads/feature, porque git remote prune no elimina ninguna referencia refs/heads/*.

Es posible identificar las ramas locales, asociadas con las ramas de seguimiento remoto, mediante el parámetro de configuración branch.<branch_name>.merge. Este parámetro no es realmente necesario para que funcione nada (probablemente, excepto git pull), por lo que puede que falte.

(actualizado con el ejemplo & información útil a partir de los comentarios)

+0

Entendí la situación es: las ramas todavía están presentes localmente pero se eliminan del repositorio remoto. Ahora quiero eliminar todas las sucursales locales que no existen en el control remoto, por lo tanto, ejecuto git prune. Eso es lo que "Estas ramas viciadas ya han sido eliminadas del repositorio remoto", me dice. ¿Me equivoco? – Felixyz

+3

Tiene razón, pero puede haber malinterpretado el significado de "sucursales locales" en el caso de 'git prune'. Solo las ramas en '/ refs/remotes/ /' están sujetas a poda; las ramas en '/ refs/heads /' no se tocarán, tienes que administrarlas manualmente. – max

+0

Ajá, eso es lo que yo pensaba. Entonces, no hay forma de hacer lo que quiero: eliminar automáticamente todas las ramas en los cabezales que están rastreando ramas remotas, al verificar si esas ramas remotas se eliminan. – Felixyz

Cuestiones relacionadas