git describe
Gibt einem Commit einen lesbaren Namen nach dem nächsten Tag
Der Befehl 'git describe' benennt einen Commit nach dem nächsten von ihm erreichbaren Tag: der Tag selbst, wenn der Commit getaggt ist, sonst tag-N-gHASH (N Commits nach dem Tag, dann der abgekürzte Hash). Build-Skripte stempeln damit jede Build-Version. Standardmäßig zählen nur annotierte Tags.
Syntax
git describe [--tags] [--always] [--dirty] [--abbrev=<n>] [<commit-ish>...]Optionen
Die richtige Option wählen
Einen describe-Namen lesen
v1.0-2-g1a2b3c4
| Befehl | Bedeutung |
|---|---|
v1.0 | Der nächste Tag |
2 | Commits seit diesem Tag |
g1a2b3c4 | „g" für git + der abgekürzte Hash |
-dirty | Nicht committete Änderungen (mit --dirty) |
Beispiele
HEAD beschreiben
git describev1.0-2-g1a2b3c4: zwei Commits nach v1.0.
Leichtgewichtige Tags einbeziehen
git describe --tagsAuch Tags ohne -a berücksichtigen.
Nie scheitern
git describe --always --dirtyHash, wenn kein Tag, -dirty bei lokalen Änderungen.
Workflow-Beispiele
git describe --tags --always --dirtyDen Versions-String berechnen
echo "$(git describe --tags --always)" > version.txtIhn in den Build schreiben
Fehlerbehebung
fatal: No names found, cannot describe anything.
Ursache: Das Repository hat keine Tags
Lege einen an (git tag -a v0.1 -m ...) oder nutze --always
fatal: No annotated tags can describe ...
Ursache: Es gibt nur leichtgewichtige Tags
Nutze --tags, oder lege den Tag mit -a neu an
Tipps & Stolperfallen
Best Practices
- ✓Nutze annotierte Tags für Releases, damit describe ohne --tags funktioniert.
- ✓Nutze --always in Skripten, damit sie nie scheitern.
Häufige Fehler
- ✗"No names found" bekommen, weil das Projekt nur leichtgewichtige Tags hat — ergänze --tags.
- ✗Das g in -g1a2b3c4 für einen Teil des Hashs halten: es steht nur für „git".
FAQ
Es nimmt den Tag mit den wenigsten Commits zwischen ihm und dem beschriebenen Commit.