web-dev-qa-db-fra.com

Dans git, comment synchroniser mes tags avec un serveur distant?

Existe-t-il un moyen de garder mes balises git locales en parallèle avec les balises d'une télécommande? C’est-à-dire qu’elles obtiennent non seulement de nouvelles balises lors de leur création (comme d'habitude, lorsque fetch- variable/pulling), mais aussi que les balises Prune ne sont plus sur une télécommande et suppriment également les balises existantes lorsqu'un autre git Push -f est une balise . sais que je peux git fetch remotename suivi de git remote Prune remotename pour obtenir un comportement similaire pour les branches.

37
mlb

... aussi ne supprimez plus les balises sur une télécommande

git fetch obtient avec Git 2.17 (T2 2018) un raccourci utile pour obtenir débarrasser les balises périmées détenues localement.

Voir commit 6317972 , commit 97716d2 , commit e249ce0 , commit 627a129 , commit d0e0747 , commit 2c72ed7 , commit e1790f9 , commit 59caf52 , commit 82f34e0 , commit 6fb23f5 , commit ca3065e , commit bf16ab7 , commit eca142d , commit 750d0da , commit 0711883 , commit ce3ab21 , commit aa59e0e (09 fév 2018) de Ævar Arnfjörð Bjarmason (avar) }.
(Fusionne par Junio ​​C Hamano - gitster - dans commit c1a7902 , 6 mars 2018)

fetch: ajoute une option --Prune-tags et fetch.pruneTags config

Ajoutez une option --Prune-tags à git-fetch, ainsi que l’option fetch.pruneTags config et un raccourci -P (-p est --Prune).
Cela permet de:

git fetch -p -P
git fetch --Prune --Prune-tags
git fetch -p -P Origin
git fetch --Prune --Prune-tags Origin

Ou simplement:

git config fetch.Prune true &&
git config fetch.pruneTags true &&
git fetch

Au lieu du beaucoup plus verbeux:

git fetch --Prune Origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/Origin/*'

Avant cette fonctionnalité, il était difficile de prendre en charge le cas d'utilisation consistant à tirer depuis un repo dont les deux branches et les balises sont supprimées régulièrement, et avoir nos références locales à refléter en amont.

Au travail, nous créons des balises de déploiement dans le référentiel pour chaque déploiement, et il y a beaucoup d'entre eux, ils sont donc archivés en quelques semaines pour raisons de performance.

Sans cette modification, il est difficile de configurer de telles mises en pension de manière centralisée dans /etc/gitconfig (sur les serveurs utilisés uniquement pour travailler avec them). Vous devez définir fetch.Prune=true globalement, puis pour chaque repo:

git -C {} config --replace-all remote.Origin.fetch "refs/tags/*:refs/tags/*" "^\+*refs/tags/\*:refs/tags/\*$"

Maintenant, je peux simplement définir fetch.pruneTags=true dans /etc/gitconfig également, et les utilisateurs exécutant "git pull" auront automatiquement l'élagage la sémantique que je veux.

10
VonC

Ce qui suit a fonctionné pour moi:

git fetch --Prune --tags
39

Un peu de recherche a montré que git n'a aucun moyen de faire la différence entre les balises locales et étrangères (toutes les balises vont à .git/refs/tags /). Par conséquent, il n'est pas possible de déterminer la différence entre les balises créées localement et les balises distantes pouvant être configurées. Les options sont alors réduites à: avoir un ensemble de balises de plus en plus important, ou seulement les balises qui sont sur le serveur.

git Push --tags Origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags

Supprimez la première ligne pour le dernier comportement et pourrait être potentiellement git alias'd pour un usage fréquent.

Une alternative serait de créer une branche (car ils peuvent être identifiés en tant que local/distant) à un point de repère et ne jamais y écrire à nouveau. Ensuite, utiliser remotename/branchname en tant que balise pour valider garderait les balises synchronisées (en plus de git fetch et git remote Prune remotename).

De toute façon, c'est un hack, et la "bonne" réponse est de cesser de changer les tags tout le temps.

17
mlb

Une autre solution qui fonctionne réellement pour moi:

git tag -l | xargs git tag -d && git fetch -t
6
Ron

git Push --tags va pousser vos tags locaux vers le serveur. Par défaut, git fetch (la première moitié de git pull ou git pull --rebase) tirera les balises, mais vous pouvez spécifier -t ou --tags pour toutes les tirer.

Je ne suis pas sûr de savoir comment supprimer les balises supprimées à distance, mais l'extraction devrait extraire toutes les balises mises à jour de force.

5
LJHarb

disclaimer ceci utilise les éléments internes de git (certains peuvent affirmer que le système de fichiers est une interface git, mais ce sera pour un autre jour: D)

# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .git/refs/tags/*

# Download all the tags from the remote
git fetch --tags
4
Anthony Sottile

Voici une solution alternative:

git fetch -p +refs/tags/*:refs/tags/*

Depuis le git fetch doc:

-p --Prune

Avant d'extraire, supprimez toutes les références de suivi à distance qui ne sont plus existe sur la télécommande. Les étiquettes ne sont pas sujettes à la taille si elles sont récupéré uniquement en raison du suivi automatique de la balise par défaut ou en raison d'un Option --tags. Cependant, les balises if sont extraites en raison d'un refspec explicite (sur la ligne de commande ou dans la configuration distante, par exemple Si la commande distante a été clonée avec l'option --mirror), puis eux __. sont également soumis à la taille.

0
solstice333