Je souhaite que mes référentiels locaux et distants soient toujours synchronisés en termes de branches.
Après un examen de la demande d'extraction sur GitHub, je fusionne et supprime ma branche (distante). Comment puis-je récupérer ces informations dans mon référentiel local et obtenir que Git supprime également ma version locale de la branche?
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
NB: si vous n'êtes pas sur master
, cela peut potentiellement supprimer la branche. Continuez à lire pour le "meilleur moyen".
Vous pouvez vous assurer que master
, ou toute autre branche, ne soit pas supprimé par grep
ing pour plus d'informations. Dans ce cas, vous iriez:
git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
Donc si nous voulions garder master
, develop
et staging
par exemple, nous irions:
git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d
Comme il est un peu long, vous voudrez peut-être ajouter un alias à votre .zshrc
ou .bashrc
. Le mien s'appelle gbpurge
(pour git branches purge
):
alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'
Rechargez ensuite votre .bashrc
ou .zshrc
:
. ~/.bashrc
ou
. ~/.zshrc
J'utilise le même flux avec GitHub, et les réponses précédentes ne me satisfaisaient pas, car git branch --merged
répertorie les branches qui ont été fusionnées, mais toutes n'ont pas été supprimées à distance dans mon cas. Donc, cela a fonctionné pour moi:
git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
où:
git fetch --all -p
: met à jour le statut des branches localesgit branch -vv
: liste le statut des branches localesgrep ": gone]"
: filtre les effacésawk '{ print $1 }'
: extraire leurs nomsxargs -n 1 git branch -d
: donne le nom à la commande de suppressionRemarque: si vous préférez, vous pouvez utiliser -D au lieu de -d, qui applique la suppression.
Par exemple:
someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
Origin
playground-for-tests
test-services
remotes/Origin/HEAD -> Origin/master
remotes/Origin/basic-testing
remotes/Origin/master
remotes/Origin/test-services
someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching Origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).
someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
Origin
test-services
remotes/Origin/HEAD -> Origin/master
remotes/Origin/basic-testing
remotes/Origin/master
remotes/Origin/test-services
Référence:
essayer:
git pull --Prune
qui supprime votre branche locale, si la branche distante correspondante est supprimée.
L'affirmation ci-dessus n'est pas correcte.
En fait, exécuter git pull --Prune
va ne supprime que les branches de suivi à distance comme
télécommandes/Origine/fff télécommandes/Origine/dev télécommandes/Origine/maître
Ensuite, vous pouvez exécuter git branch -r
pour vérifier les branches de suivi à distance laissées sur votre ordinateur. Supposons que les branches de gauche sont:
Origine/dev Origine/maître
ce qui signifie que la branche Origin/fff
est supprimée.
Donc, après avoir lancé git pull --Prune
, lancez simplement:
git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
vous pouvez trouver toutes les branches locales qui:
alors, <the command above> | xargs git branch -d
peut tous les supprimer.
Ceci devrait permettre d'éviter de supprimer les branches master et development avec la solution acceptée:
git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
Pour les personnes utilisant powershell, ceci est l'équivalent de la réponse ci-dessus :
git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
git branch -D
sur chacune des branches trouvéesRien de tout cela ne fonctionnait pour moi. Vous pouvez voir mon autre réponse ici: https://stackoverflow.com/a/34969726/550454
Mais essentiellement, j'ai maintenant ceci dans mon ~/.gitconfig
:
[alias]
Prune-branches = !git remote Prune Origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
Solution très simple: supprimez votre dépôt local et clonez à nouveau le distant. Cela ne semble pas très élégant, mais c’est simple et vous comprendrez exactement ce que vous faites sans lire les pages de manuel :-).
Je fais juste cela pour supprimer les branches locales fusionnées:
git branch -d $(git branch --merged)
et si vous souhaitez également supprimer les suivis inexistants:
git pull --Prune
J'ai écrit cette liste pour répertorier toutes les branches locales qui n'ont pas de branche distante correspondante:
diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..Origin\///')|tail -n +4|sed -n "s/^-//p" -
Ceci fait, il est facile de supprimer ces branches locales avec xargs
:
diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..Origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
Dans le cas où vous venez de pousser et de fusionner votre branche en maître, procédez comme suit dans git bash:
git branch -d branch_name_to_delete
Si vous êtes actuellement dans cette branche, il vous repoussera à maîtriser. À ce stade, faites un pull avec
git pull