Corriger « would clobber existing tag » dans Git.
Git affiche « would clobber existing tag » lorsqu’un fetch remplacerait un tag local existant par un objet différent. Comparez les deux références du tag, préservez la référence locale et n’actualisez que ce tag si la version distante fait autorité.
La méthode sûre
Repérez le tag cité dans l’erreur. Comparez les identifiants des objets local et distant, créez une sauvegarde locale, puis forcez le fetch de ce seul tag vérifié si la version distante est correcte. Ne forcez pas tous les tags et ne poussez aucun remplacement vers le dépôt distant.
Les tags annotés possèdent leurs propres identifiants d’objet. Deux objets tag peuvent pointer vers le même commit tout en ayant un message ou une signature différents ; comparez les références des tags et leurs cibles déréférencées avant de déterminer ce qui a changé.
1. Inspecter le tag exact
Remplacez v1.2.3 par le tag cité dans l’erreur et origin par votre dépôt distant. Ces commandes ne modifient aucune référence.
git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'
git ls-remote --tags origin 'refs/tags/v1.2.3' 'refs/tags/v1.2.3^{}'La première commande affiche l’identifiant de l’objet tag local. La deuxième traverse un tag annoté jusqu’à son objet cible. La sortie distante montre la référence du tag et, pour un tag annoté, une ligne terminée par ^{} contenant sa cible déréférencée.
Utilisez les noms de référence complets indiqués ici : une recherche avec le préfixe v1.2.3 pourrait aussi inclure v1.2.30. Si aucun tag distant ne correspond, arrêtez-vous ; cette procédure ne justifie pas de supprimer le tag local.
2. Préserver la référence locale d’origine
Créez un tag local de récupération avant tout remplacement. Le dernier argument vide exige que le nom de la sauvegarde ne soit pas déjà utilisé.
git update-ref refs/tags/backup/v1.2.3 refs/tags/v1.2.3 ""
git rev-parse refs/tags/v1.2.3 refs/tags/backup/v1.2.3Les deux identifiants d’objet doivent être identiques. Vous préservez ainsi l’objet tag d’origine, y compris le message et la signature d’un tag annoté. Si la création échoue parce que la sauvegarde existe déjà, choisissez un nouveau nom et vérifiez-le avant de continuer.
Conservez la sauvegarde jusqu’à la résolution du désaccord. Elle reste locale sauf si vous la poussez ; n’utilisez pas git push --tags pour cette réparation.
3. Actualiser uniquement le tag vérifié
N’exécutez cette étape qu’après avoir confirmé que le tag distant fait autorité et que la sauvegarde existe. Le + initial autorise le remplacement de cette seule référence locale.
git fetch --no-tags --no-prune --no-prune-tags origin '+refs/tags/v1.2.3:refs/tags/v1.2.3'
git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'--no-tags désactive le suivi automatique des autres tags. --no-prune et --no-prune-tags désactivent, pour ce fetch, le nettoyage normal et le nettoyage configuré des tags afin que la réparation ne s’élargisse pas. Aucune branche ni aucun tag distant n’est poussé ou remplacé.
Comparez l’objet tag récupéré et sa cible déréférencée aux identifiants distants examinés plus tôt. Si le dépôt distant change pendant la réparation, arrêtez-vous et analysez la situation avant d’utiliser le tag pour une version. La sauvegarde désigne toujours votre objet d’origine.
Pourquoi Git refuse la mise à jour
Depuis Git 2.20, fetch exige un force explicite pour remplacer une référence refs/tags/* existante. Cette règle s’applique même si les deux cibles sont liées par l’ascendance des commits ; les tags ne suivent pas les règles de fast-forward des branches.
Si votre tag local correspond à la bonne version, conservez-le et coordonnez-vous avec la personne qui maintient le projet. Remplacer un tag distant publié change ce que les autres utilisateurs reçoivent sous le même nom de version.
Références Git officielles
Inspectez d’abord, puis modifiez la plus petite référence possible.
FluxGit réunit les tags, l’hygiène du dépôt et les opérations protégées dans un client Git pour macOS, Windows et Linux. Utilisez les commandes ci-dessus pour diagnostiquer cette erreur Git avant de modifier une référence.