web-dev-qa-db-fra.com

Supprimer plusieurs branches distantes dans git

J'ai un membre de l'équipe qui, par inadvertance, a déplacé plus de 150 de ses succursales locales vers notre référent central. Heureusement, ils ont tous le même préfixe. En utilisant ce préfixe, y a-t-il une commande git ou un petit script Shell cool que je peux utiliser pour supprimer tous ces éléments à la fois?

101
Jake A. Smith

Utilisez la commande suivante pour supprimer toutes les branches avec le préfixe PREFIX sur le serveur distant.

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git Push Origin :{}

Vous voudrez peut-être commencer par un essai pour voir si ce sont les branches que vous souhaitez supprimer:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'
113
neevek

Si vous préférez une approche plus simple, supprimez par exemple 3 ou 4 branches:

git Push Origin --delete <branch1> <branch2> <branch3>

Important: Ne fonctionne que sur Git v1.7.0 et supérieur.

79
jfeston

Merci à Neevek pour cette solution géniale et élégante!

Mais j'ai quelques problèmes avec les barres obliques dans les noms de branches (j'utilise Git Flow), à cause du séparateur de champs awk/ (option -F)

Donc, ma solution est basée sur Neevek , mais analyse correctement les noms de branche avec /. Dans ce cas, je suppose que votre télécommande s'appelle Origin. Commande de suppression des branches distantes dont le nom est précédé de PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git Push Origin :{}

Et n'oubliez pas de vérifier ce que vous allez supprimer:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

CONSEIL UTILE: Si vos noms de branche (sans le préfixe Origin/) sont stockés dans un fichier texte (un nom de branche par ligne), exécutez simplement:

cat your_file.txt | xargs -I {} git Push Origin :{}
28
Dmitriy

La même chose avec grep: git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git Push Origin :{}.

branch -r affiche Origin/prefix/branchname. Donc, il faudra prefix/branchname.

9
Kirby

La solution de Neevek est élégante, mais elle peut être meilleure: la solution proposée appelle «git Push» une fois par branche, ce qui signifie qu'un aller-retour réseau supplémentaire par branche sera supprimé. Puisque vous utilisez de toute façon awk, pourquoi ne pas l'utiliser pour préfixer le ':', puis xargs peut appeler 'git Push' une fois et supprimer toutes les branches à la fois:

Exécution à sec pour répertorier les branches à supprimer:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

La solution finale pour réellement pousser les suppressions:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git Push Origin
8
lack

ressource https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git Push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git Push Origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote Prune Origin
7
Ashish Sajwan

Merci à Neevek. Cela a bien fonctionné après l'avoir reconfiguré pour mes besoins:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git Push Origin :{}

J'avais également besoin de prendre en compte la structure des dossiers. Mes fonctions-branches sont dans une structure de dossier comme Origin/feature/PREFIX-FEATURENUMBER. Je devais donc construire mon modèle à partir de $ 2 = dossier + $ 3 = nom de branche.

4
user3416278

Grâce à Steve et à Neevek, j’ai trouvé une solution qui fonctionnait assez bien pour moi et qui méritait d’être partagée:

La solution de Steve a fonctionné pour moi avec un ajustement mineur. Mes télécommandes ont été nommées Origin/feature/some-feature-name alors j'ai coupé votre awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git Push Origin :{}

Il fait maintenant un joli petit flux de suppression:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

Je me demandais si quelqu'un avait des idées pour une solution plus élégante, cependant, qui pourrait produire quelque chose comme ceci (mon script CLI est plutôt médiocre, donc il me faudrait un moment pour comprendre cela):

git Push Origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

Cela aboutirait à une seule sortie Nice avec une requête réseau:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk
3
andrewmart.in

Tout le monde utilise awk, je ne sais pas pourquoi. J'ai l'impression que c'est plus complexe. Voici ce que j'utilise pour supprimer toutes les branches distantes de ma télécommande fork:

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git Push --delete fork

Ajoutez une grep entre xargs et sed si vous devez filtrer la liste en un sous-ensemble de branches distantes.

2
void.pointer

Cela peut être une réponse en double mais ci-dessous testé et travaillé pour moi parfaitement.

  1. Supprimer la branche locale avec force

git branch -D nom-branche

  1. Supprimer la branche distante

git Push Origin --delete nom de la branche

  1. Supprimer plus d'une branche locale

git branche -D nom-branche1 nom-branche2

  1. Supprimer plus d'une branche distante

git Push Origin --delete nom-branche1 nom-branche2

  1. Supprimer la branche locale avec le préfixe. Par exemple, fonctionnalité/*

branche git -D git branch --list 'feature/*'

  1. Liste des branches distantes avec préfixe.

branche git -r | grep -Eo 'feature /.*'

  1. Supprimer une branche distante avec un préfixe 

branche git -r | grep -Eo 'feature /.*' | xargs -I {} git Push Origin : {}

1
Naren

Je réalise que c'est pour la commande git, mais si vous cherchez une solution alternative pour obtenir le même résultat ou le même résultat 

Vous pouvez le faire à partir d’ici (Git Remove Remote Branches): 

Ensuite, sélectionnez les branches que vous voulez:

Assurez-vous de disposer des autorisations nécessaires pour supprimer les branches distantes.

1
Ewin Hong

Github dispose également d’une interface utilisateur agréable et d’un mécanisme permettant de supprimer rapidement les branches, c’est-à-dire si vous préférez utiliser une interface utilisateur.

1
Alex

J'ai essayé de supprimer toutes les branches distantes de Origin/release/r1-1 *, donc la ligne de commande suivante a bien fonctionné.

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git Push Origin :{}
0
Atish Narlawar

Je n'ai pas pu utiliser awk car nous utilisons une structure de barre oblique pour le nom de nos branches.

git branch -r | grep "Origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git Push Origin --delete {}'

Ceci permet d'obtenir toutes les branches distantes, d'obtenir uniquement celle d'un utilisateur, de distancer la chaîne "Origine /" et d'exécuter une suppression sur chacune d'entre elles.

0
Patrick Desjardins