le nettoyage de la vieille distance branches git
Voici mon workflow git.
Je travaille à partir de deux ordinateurs différents (A et B) et de stocker une commune git distant dans le répertoire dropbox.
Disons que j'ai deux branches de master et de devel. Les deux sont le suivi de leur distance homologues origin/master et d'origine/devel.
Maintenant, alors que sur Un ordinateur, j'ai supprimer la branche devel - en local et à distance - comme suit:
git push origin :heads/devel
git branch -d devel
Maintenant, si je ne git branch -a
sur Un ordinateur, je reçois
master
origin/HEAD
origin/master
Je passe maintenant à l'ordinateur B. Ne git fetch
. Je peux supprimer le local de la branche devel par
git branch -d devel
Mais je ne peux pas retirer la télécommande branche devel.
git push origin :heads/devel
error: unable to push to unqualified destination: heads/proxy3d
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
fatal: The remote end hung up unexpectedly
Faire git branch -a
encore les listes origine/devel dans les branches distantes.
Comment puis-je nettoyer la télécommande de l'entrée de devel de la machine B?
- J'ai été dit par quelqu'un qui l'a essayé, que les dépôts git dans la boîte de dépôt des dossiers sont un peu fragiles (mais sans plus de détails).
- probablement parce que vous avez à attendre pour s'assurer qu'il synchronise complètement à chaque fois que vous s'engager, avant d'être sûr qu'il est sûr à utiliser sur l'autre machine (et un autre de synchronisation nécessaires, même à l'époque).
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, quel est le résultat de
git branch -a
sur la machine B?Deuxième, vous avez déjà supprimé
heads/devel
surorigin
, c'est pourquoi vous ne pouvez pas le supprimer à partir de la machine B.Essayer
ou
ou
et n'hésitez pas à ajouter
--dry-run
à la fin de votregit
déclaration de voir le résultat de l'exécution sans réellement l'exécuter.git branch -r -d origin/devel
a fonctionné pour moi. merci. maintenant que j'ai lu page de manuel degit remote prune
, je suppose que ça doit fonctionner aussi. Vais essayer la prochaine fois.git remote prune origin
a fonctionné pour moi =>* [pruned] origin/my-old-branch
git branch -r -d origin/devel
et de la branche a été suppriméSourceTree
git client, cochez la case "Prune de suivi des branches n'est plus présent sur la télécommande(s)" de la boîte lorsque vous chercher.git remote prune origin --dry-run
vous montre ce que serait supprimé w/o de le faire réellement.git fetch origin --prune
était parfait pour enlever supprimé les branchesgit branch -vv
suivie pargit branch -D branchname
et, enfin, le pruneau est le meilleur moyen.git config remote.origin.prune true
gfa
avec les oh-my-zsh git plugin: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/...git branch -vv --no-color | grep ': gone]' | awk '{print $1}'
; ne git branch-D $succursale; done je ne sais pas ce qui est fait. Mais il a travaillé pour moi.Envisager pour l'exécution :
Sur une base régulière dans chaque pensions de supprimer les branches locales qui ont été suivi à distance de la branche qui est supprimé (n'existe plus dans la distance repo GIT).
Ceci peut être encore simplifiée par
c'est un
per-repo
paramètre que l'avenir seragit fetch or git pull
automatiquement pruneau.À mettre en place pour votre utilisateur, vous pouvez également modifier le global .gitconfig et ajouter
Cependant, il est recommandé que ceci est fait en utilisant la commande suivante:
ou de l'appliquer à l'échelle du système (et pas seulement pour l'utilisateur)
Voici script bash qui peut le faire pour vous. C'est une version modifiée de la http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git script. Ma modification lui permet de soutenir à différents endroits éloignés.
sed
s. Remplacersed 's/\(.*\)\/\(.*\)/\1/g'
parsed 's/\([^/]*\)\/\(.*\)/\1/g'
Cette commande "dry run" supprimer tous à distance (
origin
) ont fusionné les branches, à l'exception demaster
. Vous pouvez la modifier, ou ajouter d'autres branches après le master:grep -v for-example-your-branch-here |
Si il semble bon, retirez le
--dry-run
. En outre, comme vous pouvez le tester sur une fourche en premier.Si
git branch -r
montre beaucoup de distance de suivi de branches que vous n'êtes pas intéressé et que vous voulez les supprimer seulement de locaux, utilisez la commande suivante:Une plus sécuritaire serait de ne retirer que la fusion de celles:
Cela peut être utile pour les grands projets, où vous n'avez pas besoin de la fonction branches de coéquipiers, mais que vous avez beaucoup de distance-suivi des branches récupérées sur le clone initial.
Et cette étape est incomplète parce que les fichiers supprimés à distance-suivi des branches montrer à nouveau à la prochaine
git fetch
.Pour arrêter l'extraction de ceux à distance-le suivi des filiales dont vous avez besoin de spécifier explicitement les refs pour aller chercher dans .git/config:
Dans l'exemple ci-dessus, nous avons seulement chercher
master
,develop
et la libération des branches, se sentir libre et ajouter le vôtre.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 courante (mon préféré). Des acclamations.-r
drapeau signifie? Je voisxargs
a un-R
argument, mais n'ai rien trouvé sur-r
. Je veux dire, en théorie, si je me souviens bien commentxargs
fonctionne, même sans-r
il devrait fonctionner.| xargs git branch -d
. Aussi, par la suppression de la-r
option (--remotes
) à partir degit branch -d
nous seulement de nettoyer les branches locales (qui peuvent être assez considérant que, par défaut,git branch
ne montre pas les branches distantes de toute façon).Suppression est toujours une tâche difficile et peut être dangereux!!! Donc, d'abord exécuter la commande suivante pour voir ce qui va se passer:
En faisant comme ci-dessus,
git
vous fournira une liste de ce qui serait arrivé si la commande ci-dessous est exécutée.Puis exécutez la commande suivante pour supprimer toutes les branches de la télécommande pensions qui ne sont pas dans votre local repo:
-n
(fonctionnement à sec) pour cette commande de sorte que vous pouvez prévisualiser les modifications et puis, si tout est beau l'appeler de nouveau sans-n
.Ici est de savoir comment le faire avec SourceTree (v2.3.1):
1. Cliquez Sur Extraire
2. Cochez la case "Prune de suivi des branches ..."
3. Appuyez sur OK
4.
Je vais devoir ajouter une réponse ici, car les autres réponses sont soit ne couvrent pas mon cas, ou sont inutilement compliquées.
J'utilise github avec d'autres développeurs et je veux juste l'ensemble des caisses locales dont les télécommandes ont été (éventuellement fusionné et supprimés à partir d'un github PR être supprimés en une seule fois de ma machine. Non, les choses comme
git branch -r --merged
ne couvrent pas les branches qui n'ont pas été fusionnées au niveau local, ou ceux qui n'ont pas été fusionnés à tous (abandonné), etc, donc une solution différente est nécessaire.De toute façon, la première étape je l'ai eu d'autres réponses:
Un fonctionnement à sec de
git remote prune origin
semblait qu'il ferait la même chose dans mon cas, je suis donc allé avec la version la plus courte pour garder les choses simples.Maintenant, un
git branch -v
devrait marquer les branches dont les télécommandes sont supprimés comme[gone]
.Donc, tout ce que je dois faire c'est:
Aussi simple que cela, il supprime tout ce que je veux pour le scénario ci-dessus.
Le moins commun
xargs
syntaxe est alors qu'il fonctionne aussi sur Mac & BSD en plus de Linux.Attention, cette commande n'est pas un fonctionnement à sec de sorte qu'il aura la force-pour supprimer toutes les branches marqué comme
[gone]
. Évidemment, ceci étant git rien n'est perdu à jamais, si vous voyez des branches supprimées que vous vous rappelez que vous voulais gardé, vous pouvez toujours les récupérer (la commande ci-dessus ont inscrit leurs hachage sur la suppression, de sorte qu'un simplegit checkout -b <branch> <hash>
.