Da Anonimo (non verificato) , 29 Aprile 2026

Sinossi

git describe --tags --dirty --always [--match 'v[0-9]*']

Descrizione

Questa pagina copre git describe da un'angolatura di versioning: come progettare uno schema di tag che guida stringhe di versione di build riproducibili. L'output di git describe è ampiamente usato dai sistemi di build (Make, CMake, Cargo, script npm) per generare una stringa di versione che include un tag base più distanza e SHA.

Il pattern raccomandato: usa tag annotated semver come v1.2.3; gli script di build chiamano git describe --tags --dirty --always --match 'v[0-9]*'; la stringa risultante viene incorporata nei binari tramite un header generato o costante. Questo produce versioni deterministiche che riflettono sia l'ultima release che qualsiasi lavoro non rilasciato da allora.

Nell'uso quotidiano, git describe (versioning) si integra con alias e CI.

Capire il modello dati di Git aiuta a prevedere i risultati.

Opzioni comuni

OpzioneDescrizione
--tagsUsa anche tag lightweight oltre agli annotated.
--dirty[=<mark>]Aggiunge un marker se la tree è sporca.
--alwaysRicade su SHA abbreviato quando nessun tag è raggiungibile.
--longForza il formato lungo anche a un tag.
--match <pattern>Restringe a tag corrispondenti a un pattern (es. esclude nightly-*).
--exclude <pattern>Esclude tag corrispondenti.
--abbrev=<n>Lunghezza dello SHA abbreviato.

Esempi

# Genera una stringa di versione per una build
VERSION=$(git describe --tags --dirty --always --match 'v[0-9]*')
echo "${VERSION#v}" > VERSION

# In un Makefile:
VERSION := $(shell git describe --tags --dirty --always)
CFLAGS += -DVERSION="\"$(VERSION)\""

# Nello script prepublish di package.json:
node -e "p=require('./package.json'); p.version=process.env.VERSION; require('fs').writeFileSync('package.json', JSON.stringify(p,null,2))"

Errori comuni

Usare tag lightweight rompe git describe senza --tags. Includere tag di release candidate o nightly nel tuo pattern di match produce versioni rumorose per build stabili. I clone shallow CI possono non avere tag affatto — scaricali esplicitamente: git fetch --tags --unshallow.

Comandi correlati

git tag, git rev-parse, git for-each-ref, git log