J'ai un membre de l'équipe qui a par inadvertance transféré plus de 150 de ses succursales locales à notre repo 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 sympa que je peux utiliser qui supprimera tout cela à la fois?
129
$ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH 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. error: failed to push some refs to 'GIT_URL'
git branch -r | awk -F/ '/\/APR/{print $2}'
, pourriez-vous voir tous les noms de succursales avec préfixe APR répertoriés?APR-04-DPH
branche a déjà été supprimée. Jetez un œil à ces questions répondues: ceci et cela et aussi ceci . Les réponses à ces questions portent sur le même problème, vous voudrez peut-être tester les solutions vous-même.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Si vous aimez une approche plus simple, supprimez par exemple 3 ou 4 branches:
Important: fonctionne uniquement sur Git v1.7.0 et supérieur.
la source
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Merci à Neevek pour une solution géniale et élégante!
Mais j'ai quelques problèmes avec les barres obliques dans les noms de branche (j'utilise Git Flow), à cause du
awk
séparateur de champ/
(-F
option)Ma solution est donc basée sur celle de Neevek , mais analyse correctement les noms de branche avec
/
. Dans ce cas, je suppose que votre télécommande a appeléorigin
. Commande de suppression des branches distantes dont les noms commencent parPATTERN
:Et n'oubliez pas de vérifier ce que vous allez supprimer:
CONSEIL UTILE: Si vos noms de branche (sans
origin/
préfixe) sont stockés dans un fichier texte (un nom de branche par ligne), lancez simplement:la source
xargs -a file -L
place decat file | xargs
. Encore plus simplexargs -a file git push --delete origin
.Cela peut être une réponse en double mais ci-dessous testé et a parfaitement fonctionné pour moi.
git branch -D backticks $ (git branch - list 'feature / *' backticks )
la source
La même chose avec grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
spectaclesorigin/prefix/branchname
. Il faudra doncprefix/branchname
.la source
xargs -I {} git push origin :{}
dire non-i
.-i
il utilise le remplacement par défaut pour{}
mais avec-I
vous pouvez déclarer le vôtre. ... juste trouvé dans le manuel:-i ... the same as -I{}
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 un aller-retour réseau supplémentaire par branche à supprimer. Puisque vous utilisez de toute façon awk, pourquoi ne pas l'utiliser pour préfixer le ':' et ensuite xargs peut appeler 'git push' exactement une fois et supprimer toutes les branches à la fois:
Exécuter à sec pour lister les branches qui seraient supprimées:
Solution finale pour réellement pousser les suppressions:
la source
xargs: replstr may not be empty
solution avec Neevek, peut-être la version git ..git version 1.9.5
Mais cela a très bien fonctionné pour moi. Merci à vous deuxressource https://coderwall.com/p/eis0ba
la source
Grâce à Steve et Neevek, j'ai trouvé une solution qui fonctionnait plutôt bien pour moi et qui valait la peine 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é votreawk
:Il fait maintenant un joli petit flux de suppression:
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 assez pauvre, donc il me faudrait un certain temps pour comprendre cela):
Cela entraînerait une belle sortie unique avec une requête réseau:
la source
Merci à Neevek. Cela a bien fonctionné après l'avoir reconfiguré pour mon objectif:
J'avais également besoin de prendre en compte la structure des dossiers. Mes branches de fonctionnalités sont dans une structure de dossiers comme origin / feature / PREFIX-FEATURENUMBER. J'ai donc dû créer mon modèle à partir de $ 2 = dossier + $ 3 = branchname.
la source
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 mafork
télécommande:Lancez un
grep
entre lexargs
etsed
si vous avez besoin de filtrer la liste vers un sous-ensemble de branches distantes uniquement.la source
origin/blaprefix_anotherbla
. Mais en utilisant biensed
géré. Un autre avantage de cette approche est que j'utilise bitbucket et que je n'ai pas besoin de saisir manuellement le mot de passe d'authentification pour chaque suppression de branche. Celui-ci supprime toutes les branches en un seul lot.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Je me rends compte que c'est pour la commande git, mais si vous cherchez une solution alternative pour faire le même ou le même résultat:
Vous pouvez le faire à partir d'ici (Git Remove Remote Branches):
Sélectionnez ensuite les branches souhaitées:
Assurez-vous que vous disposez des autorisations nécessaires pour supprimer les branches distantes.
la source
Github a également une belle interface utilisateur et un mécanisme pour supprimer rapidement les branches, c'est si vous préférez utiliser une interface utilisateur
la source
J'ai essayé de supprimer toutes les branches distantes d'origine / release / r1-1 *, donc la ligne de commande suivante fonctionnait bien.
la source
Je n'ai pas pu utiliser awk car nous utilisons une structure slash pour le nom de nos branches.
Cela récupère toutes les branches distantes, n'obtient que celle pour un seul utilisateur, distante la chaîne "origin /" et exécute une suppression sur chacune d'elles.
la source
Course à sec:
Supprimer les branches distantes:
Supprimer uniquement les branches distantes entièrement fusionnées:
Explication:
sed "s/origin\///"
supprimeraorigin/
du nom de la branche. Sans enlever ça, j'ai:remote ref does not exist
la source
Les réponses précédentes m'ont aidé à supprimer toutes les branches de version de 2018. J'ai exécuté cela sur mon invite de commande Windows 10. J'ai installé clink , donc les commandes de type Linux fonctionnent pour moi.
Exécution à sec:
Si la marche à sec montre des branches qui ne sont pas à distance / d'origine. Exécutez ci-dessous la commande git prune pour corriger et vérifier à nouveau.
Supprimez une fois que vous êtes satisfait du résultat ci-dessus:
Si vous voyez:
error: unable to delete 'release-...2018': remote ref does not exist
. Exécutez ensuite la commande d'élagage précédente et réessayez.la source
Attention: cela supprimera toutes les branches distantes. Utiliser avec précaution.
Je pense que ma façon de supprimer les branches distantes est la meilleure.
Attention: cela supprimera toutes les branches distantes. Utiliser avec précaution.
la source