Nous utilisons des balises dans git dans le cadre de notre processus de déploiement. De temps en temps, nous voulons nettoyer ces balises en les supprimant de notre référentiel distant.
C'est assez simple. Un utilisateur supprime la balise locale et la balise distante dans un ensemble de commandes. Nous avons un petit script shell qui combine les deux étapes.
Le 2e (3e, 4e, ...) utilisateur dispose désormais de balises locales qui ne sont plus reflétées sur la télécommande.
Je recherche une commande similaire à celle git remote prune origin
qui nettoie localement les branches de suivi pour lesquelles la branche distante a été supprimée.
Alternativement, une simple commande pour lister les balises distantes pourrait être utilisée pour comparer aux balises locales retournées via git tag -l
.
git config fetch.pruneTags true
fera fairegit fetch
ce que vous voulez! Voir ma réponse à cette autre question .Réponses:
Bonne question. :) Je n'ai pas de réponse complète ...
Cela dit, vous pouvez obtenir une liste de balises distantes via
git ls-remote
. Pour répertorier les balises dans le référentiel référencé parorigin
, vous devez exécuter:Cela renvoie une liste de hachages et de noms de balises conviviales, comme:
Vous pouvez certainement créer un script bash pour comparer les balises générées par cette liste avec les balises que vous avez localement. Jetez un œil à
git show-ref --tags
, qui génère les noms de balises sous la même forme quegit ls-remote
).En aparté,
git show-ref
a une option qui fait le contraire de ce que vous aimeriez. La commande suivante répertorierait toutes les balises de la branche distante que vous n'avez pas localement:la source
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
C'est une grande question, je me demandais la même chose.
Je ne voulais pas écrire de script alors j'ai cherché une solution différente. La clé est de découvrir que vous pouvez supprimer une balise localement, puis utiliser git fetch pour la "récupérer" à partir du serveur distant. Si la balise n'existe pas sur la télécommande, elle restera supprimée.
Vous devez donc taper deux lignes dans l'ordre:
Celles-ci:
Supprimez toutes les balises du référentiel local. FWIW, xargs place chaque balise sortie par "tag -l" sur la ligne de commande pour "tag -d". Sans cela, git ne supprimera rien car il ne lit pas stdin (idiot git).
Récupérez toutes les balises actives du référentiel distant.
Cela fonctionne même un régal sur Windows.
la source
git tag prune origin
commande.git tag -l | %{git tag -d $_}
pour que cela fonctionne dans PowerShell. Je ne suis sûr de personne d'autre.De Git v1.7.8 à v1.8.5.6, vous pouvez utiliser ceci:
Mise à jour
Cela ne fonctionne pas sur les versions plus récentes de git (à partir de v1.9.0) en raison de la validation e66ef7ae6f31f2 . Je ne veux pas vraiment le supprimer car cela a fonctionné pour certaines personnes.
Comme suggéré par "Chad Juliano", avec toutes les versions de Git depuis la v1.7.8, vous pouvez utiliser la commande suivante:
Vous devrez peut-être entourer la partie balises de guillemets (sous Windows par exemple) pour éviter l'expansion des caractères génériques:
la source
git fetch --prune <remote> +refs/tags/*:refs/tags/*
n'a pas fonctionné en ZSH mais cela fonctionne en BASH*
mais si vous citez simplement que cela devrait aller.git fetch origin --prune --prune-tags
OUgit fetch origin --prune 'refs/tags/*:refs/tags/*'
OUgit fetch <url of origin> --prune --prune-tags
OUgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
tailler les branches et les balises de suivi à distance. vérifié dans la version git 2.18.Si vous souhaitez uniquement les balises qui existent sur la télécommande, supprimez simplement toutes vos balises locales:
Et puis récupérez toutes les balises distantes:
la source
xargs
. Si vous avez plus de balisesARG_MAX
ou des limitations similaires, cela ne fonctionnera pas. Peu probable, mais possible, et c'est pourquoixargs
c'est génial.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Commande d'alias obligatoire. Prendre plaisir. :-)On dirait que les versions récentes de Git (je suis sur git v2.20) permettent de dire simplement
Beaucoup plus propre!
https://git-scm.com/docs/git-fetch#_pruning
Vous pouvez également configurer git pour toujours tailler les balises lors de la récupération:
Si vous souhaitez uniquement élaguer les balises lors de la récupération à partir d'une télécommande spécifique, vous pouvez utiliser l'
remote.<remote>.pruneTags
option. Par exemple, pour toujours tailler les balises lors de la récupération à partir de l'origine mais pas d'autres télécommandes,la source
Toutes les versions de Git depuis la v1.7.8 comprennent
git fetch
avec une refspec, alors que depuis la v1.9.0, l'--tags
option remplace l'--prune
option. Pour une solution à usage général, essayez ceci:Pour plus d'informations sur la façon dont le comportement "--tags" avec "--prune" a changé dans Git v1.9.0, voir: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
la source
origin
parupstream
et git corrigé mes balises locales basées sur l'amont; ensuitegit push origin :<deleted-tag-name>
mis à jour mon fork GitHub, en supprimant la balise supprimée.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
OUgit fetch origin --prune 'refs/tags/*:refs/tags/*'
OUgit fetch <url of origin> --prune --prune-tags
OUgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git prend en charge nativement le nettoyage des balises locales:
Cette commande extrait les dernières balises et supprime toutes les balises supprimées.
la source
c'est une bonne méthode:
git tag -l | xargs git tag -d && git fetch -t
Source: demisx.GitHub.io
la source
Affichez la différence entre les balises locales et distantes:
git tag
donne la liste des balises localesgit ls-remote --tags
donne la liste des chemins complets vers les balises distantescut -f2 | grep -v '\^' | sed 's#refs/tags/##'
analyse uniquement le nom de la balise de la liste des chemins de balises distantsLes lignes commençant par "<" sont vos balises locales qui ne sont plus dans le référentiel distant. S'ils sont peu nombreux, vous pouvez les supprimer manuellement un par un, s'ils sont nombreux, vous faites plus de greping et de piping pour l'automatiser.
la source
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, mais un nombre suivi d'une virgule, puis à quoi ressemblent les trois premiers caractères d'un hachage de validation (?), par exemple7,8d4
...Nous venons d'ajouter une commande git sync-local-tags à fork fork pivotal_git_scripts Gem sur GitHub:
https://github.com/kigster/git_scripts
Installez la gemme, puis exécutez "git sync-local-tags" dans votre référentiel pour supprimer les balises locales qui n'existent pas sur la télécommande.
Alternativement, vous pouvez simplement installer ce script ci-dessous et l'appeler "git-sync-local-tags":
la source
Je sais que je suis en retard à la fête, mais maintenant il y a une réponse rapide à cela:
Oui, c'est maintenant une option à récupérer.
Si vous ne voulez pas aller chercher et juste tailler:
la source
Que diriez-vous de cela - supprimez toutes les balises locales, puis récupérez à nouveau? Considérant que votre dépôt peut contenir des sous-modules:
la source
TortoiseGit peut comparer les balises maintenant.
Le journal de gauche est sur la télécommande, la droite est au niveau local.
Utilisation de la fonction Comparer les balises de la boîte de dialogue Synchroniser:
Voir également le numéro 2973 de TortoiseGit
la source
La même réponse que @Richard W mais pour Windows (PowerShell)
la source
J'ajoute la commande en
SourceTree
tant qu'action personnalisée sur mon MacOS.Réglage
Custom Actions
parSourcetree
->Preferences...
->Custom Actions
Script to run
doivent être legit
chemin.J'utilise
git fetch --prune --prune-tags origin
pour synchroniser les balises de distance à locale.la source
Dans la nouvelle version git (comme v2.26.2)
Il vous faudrait donc exécuter:
la source