web-dev-qa-db-fra.com

git remote Prune - n'a pas montré autant de branches élaguées que ce à quoi je m'attendais

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

Alors j'ai enlevé un tas de branches en utilisant

git Push Origin :staleStuff

et ensuite couru

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 indique-t-il que je ne suivais pas ces branches correctement?

112
Felixyz

Quand vous utilisez git Push Origin :staleStuff, il supprime automatiquement Origin/staleStuff, alors quand vous avez couru git remote Prune Origin, vous avez élagué une branche qui avait été supprimée par quelqu'un d'autre. Il est plus probable que vos collègues doivent maintenant exécuter git Prune pour vous débarrasser des branches que vous avez supprimées.


Alors quoi exactement git remote Prune Est-ce que? Idée principale: les branches locales (et non les branches suivies) ne sont pas touchées par git remote Prune commande et doit être supprimé manuellement.

Maintenant, un exemple concret pour une meilleure compréhension:

Vous avez un référentiel distant avec 2 branches: master et feature. Supposons que vous travaillez sur les deux branches, vous avez donc les références suivantes dans votre référentiel local (les noms de références complets sont donnés pour éviter toute confusion):

  • refs/heads/master _ (nom abrégé master)
  • refs/heads/feature _ (nom abrégé 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 tous les travaux sur le feature, le fusionne dans master et supprime la branche feature du référentiel distant.
  2. Par défaut, quand vous faites git fetch (ou git pull), aucune référence n’est supprimée de votre référentiel local, vous avez donc encore ces 4 références.
  3. Vous décidez de les nettoyer et exécutez git remote Prune Origin.
  4. git détecte que feature branche n'existe plus, donc refs/remotes/Origin/feature est une branche obsolète qui doit être supprimée.
  5. Vous avez maintenant 3 références, dont refs/heads/feature, parce que git remote Prune ne supprime aucun 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 vraiment pas nécessaire pour que quoi que ce soit fonctionne (probablement sauf git pull), il est peut-être manquant.

(mis à jour avec l'exemple et les informations utiles tirées des commentaires)

187
max