Come risolvere “would clobber existing tag” in Git.
Git segnala “would clobber existing tag” quando un fetch sostituirebbe un tag locale esistente con un oggetto diverso. Confronta entrambi i riferimenti del tag, conserva il riferimento locale e aggiorna solo quel tag se la versione remota è quella corretta.
La soluzione sicura
Individua il tag indicato nell’errore. Confronta gli ID degli oggetti locale e remoto, crea un backup locale, quindi forza il fetch solo di quel tag verificato se la versione remota è corretta. Non forzare tutti i tag e non inviare un tag sostitutivo al remoto.
I tag annotati hanno ID oggetto propri. Due oggetti tag possono puntare allo stesso commit pur avendo messaggi o firme diversi; confronta i riferimenti dei tag e le rispettive destinazioni dereferenziate prima di stabilire cosa è cambiato.
1. Controlla il tag esatto
Sostituisci v1.2.3 con il tag indicato nell’errore e origin con il tuo remoto. Questi comandi non modificano i riferimenti.
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^{}'Il primo comando mostra l’ID dell’oggetto tag locale. Il secondo attraversa un tag annotato fino al suo oggetto di destinazione. L’output remoto mostra il riferimento del tag e, per un tag annotato, una riga che termina con ^{} e contiene la destinazione dereferenziata.
Usa i nomi completi dei riferimenti mostrati qui: una ricerca per prefisso di v1.2.3 potrebbe includere anche v1.2.30. Se il remoto non contiene un tag corrispondente, fermati; questa procedura non giustifica l’eliminazione del tag locale.
2. Conserva il riferimento locale originale
Crea un tag locale di ripristino prima di sostituire qualsiasi cosa. L’ultimo argomento vuoto richiede che il nome del backup non sia già in uso.
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.3I due ID oggetto devono coincidere. In questo modo conservi l’oggetto tag originale, inclusi il messaggio e la firma di un tag annotato. Se la creazione non riesce perché il backup esiste già, scegli un nuovo nome e verificalo prima di continuare.
Conserva il backup finché la discrepanza non è risolta. Rimane locale a meno che tu non lo invii; non usare git push --tags per questa riparazione.
3. Aggiorna solo il tag verificato
Esegui questo passaggio solo dopo aver confermato che il tag remoto è quello corretto e che il backup esiste. Il + iniziale autorizza la sostituzione di questo specifico riferimento 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 disattiva il recupero automatico degli altri tag. --no-prune e --no-prune-tags disattivano per questo fetch sia la rimozione normale sia quella configurata dei tag, così la riparazione non può ampliarsi. Nessun branch o tag remoto viene inviato o sostituito.
Confronta l’oggetto tag recuperato e la sua destinazione dereferenziata con gli ID remoti controllati in precedenza. Se il remoto cambia durante la riparazione, fermati e indaga prima di usare il tag per una release. Il backup continua a indicare il tuo oggetto originale.
Perché Git rifiuta l’aggiornamento
Da Git 2.20, fetch richiede un force esplicito per sostituire un riferimento refs/tags/* esistente. Questa regola vale anche quando le due destinazioni sono collegate dalla discendenza dei commit; i tag non vengono aggiornati secondo le regole di fast-forward dei branch.
Se il tag locale identifica la release corretta, conservalo e coordinati con chi mantiene il progetto. Sostituire un tag remoto pubblicato cambia ciò che gli altri utenti ricevono con lo stesso nome di versione.
Riferimenti Git ufficiali
Controlla prima, poi modifica il riferimento più piccolo possibile.
FluxGit riunisce tag, manutenzione del repository e operazioni protette in un client Git desktop per macOS, Windows e Linux. Usa i comandi precedenti per diagnosticare questo errore Git prima di modificare un riferimento.