Ma situation est la suivante ... quelqu'un travaillant sur le même référentiel a supprimé une branche de son référentiel local et distant ...
La plupart des personnes qui ont posé des questions sur ce type de problème sur Stack Overflow ou sur d'autres sites ont le problème des branches toujours affichées dans leur liste de branches de suivi à distance git branch -a
en bas:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
Cependant, dans MA situation, la branche qui ne devrait pas être là est locale:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Lorsque je fais l'une des actions suivantes, elle n'est pas supprimée localement:
$ git prune
J'ai aussi essayé:
$ git remote prune origin
$ git fetch --prune
Plus d'informations utiles: Lorsque je vérifie, git remote show origin
voici à quoi cela ressemble:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Notez que ce n'est que dans la section intitulée Local branches configured for 'git pull':
Pourquoi?
git
remote-branch
gogogadgetinternet
la source
la source
git branch -d the_local_branch
x/y
): elle a été corrigée (voir ma réponse ci-dessous )Réponses:
Je ne vous blâme pas d'être frustré à ce sujet. La meilleure façon de voir les choses est la suivante. Il existe potentiellement trois versions de chaque branche distante:
(par exemple, le dépôt à distance sur https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(par exemple, repo local,
refs/remotes/origin/master
)(par exemple, repo local,
refs/heads/master
)Commençons par
git prune
. Cela supprime les objets qui ne sont plus référencés, il ne supprime pas les références. Dans votre cas, vous avez une succursale locale. Cela signifie qu'il y a une référence nomméerandom_branch_I_want_deleted
qui se réfère à certains objets qui représentent l'histoire de cette branche. Donc, par définition,git prune
ne supprimera pasrandom_branch_I_want_deleted
. Vraiment,git prune
c'est un moyen de supprimer les données qui se sont accumulées dans Git mais qui ne sont référencées par rien. En général, cela n'affecte pas votre vision des branches.git remote prune origin
et lesgit fetch --prune
deux opèrent sur des références sousrefs/remotes/...
(je les appellerai références distantes). Cela n'affecte pas les succursales locales. Lagit remote
version est utile si vous souhaitez uniquement supprimer les références distantes sous une télécommande particulière. Sinon, les deux font exactement la même chose. Donc, en bref,git remote prune
etgit fetch --prune
opérez sur le numéro 2 ci-dessus. Par exemple, si vous avez supprimé une branche à l'aide de l'interface graphique Web de git et que vous ne voulez plus qu'elle apparaisse dans votre liste de branches locale (git branch -r
), alors c'est la commande que vous devez utiliser.Pour supprimer une branche locale, vous devez utiliser
git branch -d
(ou-D
si elle n'est fusionnée nulle part). FWIW, il n'y a pas de commande git pour supprimer automatiquement les branches de suivi locales si une branche distante disparaît.la source
xargs git branch -D
, mais notez que toutes les nouvelles branches que vous avez créées mais jamais poussées vers le serveur seront supprimées, alors soyez prudent:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
fichier dans la.git
zone), il n'est donc pas nécessairement simple de les supprimer via l'explorateur de fichiers. Mieux vaut utiliser les commandes pour vous assurer que les deux sont correctement pris en charge.git remote prune
etgit fetch --prune
faites la même chose: supprimer les références aux branches qui n'existent pas sur la télécommande, comme vous l'avez dit. La deuxième commande se connecte à la télécommande et récupère ses branches actuelles avant l'élagage.Cependant, il ne touche pas les succursales locales que vous avez consultées, que vous pouvez simplement supprimer avec
Remplacer
-d
par-D
si la branche n'est pas fusionnée ailleursgit prune
fait quelque chose de différent, il purge les objets inaccessibles, les validations qui ne sont accessibles dans aucune branche ou balise, et qui ne sont donc plus nécessaires.la source
git prune
ne recherche pas seulement les branches et les balises, mais aussi toutes les autres références.git remote prune
)Dans le cas où quelqu'un serait intéressé. Voici un script shell rapide qui supprimera toutes les branches locales qui ne sont pas suivies à distance. Un mot d'avertissement: cela supprimera toute branche qui n'est pas suivie à distance, qu'elle ait été fusionnée ou non.
Si vous voyez des problèmes avec ceci, faites-le moi savoir et je le corrigerai (etc. etc.)
Enregistrez-le dans un fichier appelé
git-rm-ntb
(appelez-le n'importe quoi) surPATH
et exécutez:git-rm-ntb <remote1:optional> <remote2:optional> ...
la source
Notez qu'une différence entre
git remote --prune
etgit fetch --prune
est en cours de correction, avec commit 10a6cc8 , par Tom Miller (tmiller
) (pour git 1.9 / 2.0, T1 2014):Donc: lorsqu'un référentiel en amont a une branche ("frotz") avec le même nom qu'une hiérarchie de branche ("frotz / xxx", une convention de dénomination de branche possible ),
git remote --prune
réussissait (à nettoyer la branche de suivi à distance de votre référentiel) , maisgit fetch --prune
échouait.Plus maintenant:
la source