Je travaille à partir de deux ordinateurs différents (A et B) et stocke une télécommande git commune dans le répertoire dropbox.
Disons que j'ai deux branches, master et devel. Les deux suivent l'origine / le maître et l'origine / le développement de leurs homologues distants.
Maintenant, sur l'ordinateur A, je supprime la branche devel, sur local et distant.
git push origin :heads/devel
git branch -d devel
Fonctionnant git branch -a
sur l'ordinateur A, j'obtiens la liste de branches suivante.
- Maître
- origine / TETE
- origine / maître
En cours git fetch
d' exécution sur l'ordinateur B, je peux supprimer la branche de développement local avec git branch -d devel
, mais je ne peux pas supprimer la branche de développement à distance.
git push origin :heads/devel
renvoie les messages d'erreur suivants.
erreur: impossible de pousser vers une destination non qualifiée: heads / proxy3d
La spécification de destination ne correspond ni à une référence existante sur la télécommande ni ne commence par refs /, et nous ne pouvons pas deviner un préfixe basé sur la référence source.
fatal: l'extrémité distante a raccroché de façon inattendue
git branch -a
répertorie toujours l'origine / le développement dans les branches distantes.
Comment nettoyer les branches distantes de l'ordinateur B?
la source
Réponses:
D'abord, quel est le résultat
git branch -a
sur la machine B?Deuxièmement, vous avez déjà supprimé
heads/devel
surorigin
, de sorte que de la raison pour laquelle vous ne pouvez pas le supprimer de la machine B.Essayer
ou
ou
et n'hésitez pas à ajouter
--dry-run
à la fin de votregit
déclaration pour voir le résultat de son exécution sans l'exécuter réellement.Documents pour
git remote prune
etgit branch
.la source
git remote prune origin
travaillé pour moi =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
vous montre ce qui serait supprimé sans le faire.git fetch origin --prune
était parfait pour supprimer les branches suppriméesgit branch -vv
suivi degit branch -D branchname
et enfin le pruneau est le meilleur moyen.git config remote.origin.prune true
Pensez à exécuter:
Régulièrement dans chaque référentiel pour supprimer les branches locales qui ont suivi une branche distante qui est supprimée (n'existe plus dans le référentiel GIT distant).
Cela peut être encore simplifié en
il s'agit d'un
per-repo
paramètre qui permettra à tout futurgit fetch or git pull
de tailler automatiquement .Pour configurer cela pour votre utilisateur, vous pouvez également modifier le .gitconfig global et ajouter
Cependant, il est recommandé de le faire à l'aide de la commande suivante:
ou pour l'appliquer à l'échelle du système (pas seulement pour l'utilisateur)
la source
Voici un script bash qui peut le faire pour vous. Il s'agit d'une version modifiée du script http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Ma modification lui permet de prendre en charge différents emplacements distants.
la source
sed
s. Remplacersed 's/\(.*\)\/\(.*\)/\1/g'
parsed 's/\([^/]*\)\/\(.*\)/\1/g'
Cette commande "exécutera à sec" supprimera toutes les
origin
branches fusionnées distantes ( ), à l'exception demaster
. Vous pouvez changer cela ou ajouter des branches supplémentaires après le maître:grep -v for-example-your-branch-here |
S'il semble bon, retirez le
--dry-run
. De plus, vous pouvez d'abord tester cela sur une fourche.la source
Si
git branch -r
affiche un grand nombre de branches de suivi à distance qui ne vous intéressent pas et que vous souhaitez les supprimer uniquement du local, utilisez la commande suivante:Une version plus sûre serait de supprimer uniquement les fusionnées:
Cela peut être utile pour les grands projets, où vous n'avez pas besoin des branches de fonctionnalités des autres coéquipiers, mais il existe de nombreuses branches de suivi à distance récupérées sur le clone initial.
Cependant, cette étape seule n'est pas suffisante, car ces branches de suivi à distance supprimées reviendraient lors de la prochaine
git fetch
.Pour arrêter de récupérer ces branches de suivi à distance, vous devez spécifier explicitement les références à récupérer dans .git / config :
Dans l'exemple ci - dessus , nous ne récupérons
master
,develop
et libérer des branches, ne hésitez pas à adapter selon vos besoins.la source
git fetch origin branchname
ou créer un alias commeft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
pour récupérer uniquement la branche actuelle (mon favori personnel). À votre santé.-r
drapeau? Je voisxargs
a un-R
argument mais n'a rien trouvé-r
. Je veux dire, en théorie, si je me souviens bien duxargs
fonctionnement, même sans que-r
cela fonctionne.| xargs git branch -d
. De plus, en supprimant l'-r
option (--remotes
) degit branch -d
nous ne nettoyons que les branches locales (ce qui peut être suffisant étant donné que par défautgit branch
n'affiche pas les branches distantes de toute façon).xargs -r
, à savoir--no-run-if-empty
, c'est une extension GNU, voici une belle explication .La suppression est toujours une tâche difficile et peut être dangereuse !!! Par conséquent, exécutez d'abord la commande suivante pour voir ce qui va se passer:
En faisant cela comme ci-dessus,
git
obtiendrez une liste de ce qui se passerait si la commande ci-dessous était exécutée.Exécutez ensuite la commande suivante pour supprimer toutes les branches du référentiel distant qui ne se trouvent pas dans votre référentiel local:
la source
-n
(exécution à sec) à cette commande afin que vous puissiez prévisualiser les modifications, puis si tout va bien, appelez-le à nouveau sans-n
.Voici comment le faire avec SourceTree (v2.3.1):
1. Cliquez sur Récupérer
2. Cochez "Tailler les branches de suivi ..."
3. Appuyez sur OK
4. 😀
la source
Je vais devoir ajouter une réponse ici, car les autres réponses ne couvrent pas mon cas ou sont inutilement compliquées. J'utilise github avec d'autres développeurs et je veux juste que toutes les branches locales dont les télécommandes ont été (éventuellement fusionnées et) supprimées d'un github PR soient supprimées en une seule fois de ma machine. Non, des choses comme
git branch -r --merged
ne couvrent pas les branches qui n'ont pas été fusionnées localement, ou celles qui n'ont pas du tout été fusionnées (abandonnées), etc., une solution différente est donc nécessaire.Quoi qu'il en soit, la première étape, je l'ai obtenue à partir d'autres réponses:
Un essai à sec
git remote prune origin
semblait faire la même chose dans mon cas, j'ai donc opté pour la version la plus courte pour rester simple.Maintenant, un
git branch -v
devrait marquer les branches dont les télécommandes sont supprimées comme[gone]
. Par conséquent, tout ce que je dois faire est de:Aussi simple que cela, il supprime tout ce que je veux pour le scénario ci-dessus.
La
xargs
syntaxe la moins courante est qu'elle fonctionne également sur Mac et BSD en plus de Linux. Attention, cette commande n'est pas un run à sec donc elle va forcer-supprimer toutes les branches marquées comme[gone]
. Évidemment, cela étant rien ne disparaît pour toujours, si vous voyez des branches supprimées dont vous vous souvenez que vous vouliez les conserver, vous pouvez toujours les supprimer (la commande ci-dessus aura répertorié leur hachage lors de la suppression, donc simple)git checkout -b <branch> <hash>
.la source
Taillez les mêmes branches à partir des références locales et distantes (dans mon exemple de
origin
).la source