115 votes

git remote prune - n'a pas montré autant de branches élaguées que prévu

De la page de manuel :

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>".

J'ai donc enlevé un tas de branches en utilisant

git push origin :staleStuff

et a ensuite exécuté

git remote prune origin

Cependant, une seule branche locale a été élaguée. Certaines de ces branches ont été créées par moi, d'autres par des collègues. Cela signifie-t-il que je ne suivais pas correctement ces branches au départ ?

8 votes

Pour savoir quelles branches vont être enlevées, vous pouvez faire git remote show origin et cherchez les branches marquées stale

191voto

max Points 16106

Lorsque vous utilisez git push origin :staleStuff il supprime automatiquement origin/staleStuff donc quand vous avez exécuté git remote prune origin vous avez élagué une branche qui avait été enlevée par quelqu'un d'autre. Il est plus probable que vos collègues doivent maintenant exécuter git prune pour se débarrasser des branches que vous avez retirées.


Alors, quoi exactement git remote prune fait ? Idée principale : les branches locales (pas les branches de suivi) ne sont pas touchées par git remote prune et doit être supprimé manuellement.

Maintenant, un exemple concret pour mieux comprendre :

Vous avez un référentiel distant avec 2 branches : master et feature . Supposons que vous travaillez sur les deux branches, et que par conséquent vous avez ces références dans votre dépôt local (les noms complets des références sont donnés pour éviter toute confusion) :

  • refs/heads/master (nom court master )
  • refs/heads/feature (nom court feature )
  • refs/remotes/origin/master (nom court origin/master )
  • refs/remotes/origin/feature (nom court origin/feature )

Maintenant, un scénario typique :

  1. Un autre développeur termine tout le travail sur le feature et le fusionne avec master et supprime feature branche du dépôt distant.
  2. Par défaut, lorsque vous faites git fetch (ou git pull ), aucune référence n'est supprimée de votre référentiel local, vous avez donc toujours ces 4 références.
  3. Vous décidez de les nettoyer, et vous lancez git remote prune origin .
  4. git détecte que feature n'existe plus, donc refs/remotes/origin/feature est un rassis branche qui doit être supprimée.
  5. Vous avez maintenant 3 références, dont refs/heads/feature parce que git remote prune ne supprime pas les refs/heads/* références.

Il est possible d'identifier les branches locales, associées aux branches de suivi à distance, en branch.<branch_name>.merge paramètre de configuration. Ce paramètre n'est pas vraiment nécessaire pour que tout fonctionne (sauf probablement git pull ), il se peut donc qu'elle soit manquante.

(mis à jour avec un exemple et des informations utiles provenant des commentaires)

0 votes

J'ai compris que la situation était la suivante : les branches sont toujours présentes localement mais supprimées du dépôt distant. Maintenant je veux supprimer toutes les branches locales qui n'existent pas sur le dépôt distant, donc je lance git prune. C'est ce que me dit "These stale branches have already been removed from the remote repository". Ai-je tort ?

3 votes

Vous avez raison, mais vous avez peut-être mal compris la signification de "branches locales" dans le cas de git prune . Seules les branches en /refs/remotes/<remote_name>/ sont soumises à l'élagage ; toutes les branches en /refs/heads/ ne seront pas touchés - vous devez les gérer manuellement.

0 votes

Aha, c'est en effet ce que je pensais. Il n'y a donc aucun moyen de faire ce que je veux : supprimer automatiquement toutes les branches dans les têtes qui suivent des branches distantes, en vérifiant si ces branches distantes sont supprimées ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X