it-swarm.com.de

So erhalten Sie das letzte Git-Tag, das den Regex-Kriterien entspricht

Ich benötige den Git-Befehl get/find last tag, beginnend mit 'v', um das letzte Versions-Commit zu erhalten (ich verwende Tags mit dem Buchstaben v am Anfang, um die nächste Anwendungsversion zu kennzeichnen ( Beispiel: v0.9.1beta ).

Gibt es eine Möglichkeit, dies zu tun?

32
Lukasz

Ich benutze dazu den folgenden Befehl:

git describe --match "v[0-9]*" --abbrev=4 HEAD

Die Version wird auch geändert, wenn Sie seit dem letzten versionierten Tag etwas mit dem Quelltextbaum gemacht haben.

Bitte beachten Sie, dass dies nicht ein regulärer Ausdruck ist, sondern ein Glob, der jedoch für das angegebene Beispiel funktioniert.

46
KARASZI István
git tag -l -n v*
5
racerror

KARASZI Istváns Antwort erklärt bereits, wie man Tags findet, die zu glob passen, was normalerweise gut genug ist. Sollten Sie jemals einen echten RegEx brauchen:

for tag in $(git tag | grep YOURREGEX); do
    git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
  • Wenn Sie nur das nächstgelegene Tag wünschen (d. H. Was --abrev=0 erreichen würde), fügen Sie | cut -d"-" -f1 hinzu.
  • Wenn Sie nicht möchten, dass --long auch ein genau passendes Tag einschließlich des -0-hash-Teils ausgibt, fügen Sie stattdessen | sed -e's/-0-.*$//' hinzu.

Das Beispiel-Tag der Frage würde wahrscheinlich einen Regex ^v\d+\.\d+\.\d+\D*$ verwenden (obwohl der \D*$ optional sein könnte).

4
Tobias Kienzler
git describe --match v*

Benutze das.

2
Lukasz

Obwohl ein einziger regulärer --match "v[0-9]*" hier ausreicht, wissen Sie, dass Git 2.13 (Q2 2017) dies verbessern wird:

Es wurde gelehrt, dass " git describe " und " git name-rev " mehr als ein Referenznamenmuster verwenden, um die Menge der Referenznamen zu beschränken, auf denen ihre Namensausgabe basiert. Außerdem wurde gelernt, negative Muster zu verwenden, um Referenznamen nicht zu benennen für die Benennung über die Option "--exclude" verwendet werden.

Siehe Festschreiben 77d21f2 , Festschreiben 43f8080 , Festschreiben 96415b4 , Festschreiben 290be66 , Festschreiben 4a68748 (18. Januar 2017) von Jacob Keller (jacob-keller) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 1b32498 , 27. Februar 2017)

Sie können jetzt mehrere Übereinstimmungsmuster haben :

--match <pattern>:

Berücksichtigen Sie nur Tags, die mit dem angegebenen glob(7)-Muster übereinstimmen, mit Ausnahme des Präfixes "refs/tags /".
Dies kann verwendet werden, um zu verhindern, dass private Tags aus dem Repository verloren gehen.

Bei mehrmaliger Angabe wird eine Liste von Mustern erstellt, und Tags, die mit einem der Muster übereinstimmen, werden berücksichtigt.
Verwenden Sie --no-match, um die Liste der Muster zu löschen und zurückzusetzen.

Und Sie haben jetzt auch ein Muster ausschließen (oder mehrere) !

--exclude <pattern>::

Berücksichtigen Sie keine Tags, die mit dem angegebenen glob(7)-Muster übereinstimmen, mit Ausnahme des Präfixes "refs/tags /".

Dies kann verwendet werden, um den Tag-Bereich einzugrenzen und nur Tags zu finden, die einigen aussagekräftigen Kriterien entsprechen.
Bei mehrmaliger Angabe wird eine Liste von Mustern gesammelt und Tags, die mit einem der Muster übereinstimmen, werden ausgeschlossen.
In Kombination mit --match wird ein Tag berücksichtigt, wenn es mindestens einem --match-Muster entspricht und keinem der --exclude-Muster entspricht.
Verwenden Sie --no-exclude, um die Liste der Muster zu löschen und zurückzusetzen.

2
VonC

Außerdem können Sie mit git describe das neueste Tag erhalten, das nicht nur über HEAD erreichbar ist:

git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)

2
Barthelemy Pavy

Das Problem bei der Verwendung von git describe wie bei den anderen Antworten ist, dass git describe Ihnen Tags anzeigt, die über HEAD (oder das von Ihnen angegebene Commit) erreichbar sind.

Stellen Sie sich vor, Sie haben 3 Tags, v1, v2 und v3. Wenn sich HEAD an einem Punkt zwischen v2 und v3 befindet, würde git describe v2 und nicht v3 zurückgeben.

Wenn Sie tatsächlich das neueste Tag möchten, benötigen Sie zunächst kommentierte Tags, da Lightweight-Tags keine Datumsmetadaten enthalten.

Dann wird dieser Befehl es tun:

git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*

1
Joe Alcorn

Ich benutze

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"

git tag interpretiert das Muster als glob. Sie können also keinen vollständigen regulären Ausdruck angeben. Verwenden Sie einfach einen minimalen Glob (v *) oder gar keinen Glob. Sie erhalten mehr als nur ein passendes Tag in sortierter Reihenfolge (höchste Tag-Version zuerst) und können die Ausgabe anschließend neu ausgeben.

0
Henning