Wie kann ich alle Tags in meinem Git-Repository bis zum Erstellungsdatum auflisten?

128

Ich brauche eine Möglichkeit, alle Tags in meinem System bis zum Erstellungsdatum aufzulisten, bin mir aber nicht sicher, ob ich diese Daten über Git-Log erhalten kann. Ideen?

Jon Ursenbach
quelle
2
Meinen Sie damit, dass Sie die Liste aller Tags in der Reihenfolge ihrer Erstellungsdaten abrufen möchten ?
Lithuak
3
Zu Ihrer Information (1.) Diese Frage dient zur Auflistung von ANNOTATED-Tags nach Datum. (2.) Eine Liste der LIGHTWEIGHT-Tags nach Datum finden Sie hier . (3.) Eine hilfreiche Erinnerung an den Unterschied zwischen Git's Lightweight- und Annotated-Tags finden Sie hier .
Trevor Boyd Smith
@ TrevorBoydSmith: Das ist nicht ganz richtig. Der Unterschied besteht darin, dass (2) alle Tags nach dem Festschreibungsdatum des getaggten Festschreibens auflistet , während diese Seite Lösungen enthält, die nach dem mit Tags versehenen Datum sortiert sind (allerdings nur für mit Anmerkungen versehene Tags, da git das für leichte Tags mit Tags versehene Datum nicht speichert).
David P

Antworten:

174

Das Sortieren nach dem Erstellungsdatum des Tags funktioniert mit kommentierten und leichtgewichtigen Tags:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
Josh Lee
quelle
12
Genial. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagstat genau das, was ich brauchte. Vielen Dank!
Jon Ursenbach
21
Eine Lösung von @DrorCohen, die für Lightweight-Tags funktioniert : stackoverflow.com/questions/6900328/… . Zum einfachen Nachschlagen hier einfügen: git log --tags --simplify-by-decoration --pretty = "Format:% ai% d"
Gilead
5
Kann verwendet werden %(contents), um bei Bedarf Anmerkungen hinzuzufügen, z. B.git for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins
7
Oder sogar ein bisschen sauberer:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers
4
--sort=creatordatefunktioniert sowohl für mit Anmerkungen versehene als auch für nicht mit Anmerkungen versehene Tags, --sort=taggerdatescheint jedoch nur mit mit Anmerkungen versehenen Tags zu funktionieren. getestet mitgit version 2.16.3
Austinheiman
56

Git 2.8 (März 2016) dokumentiert eine weitere Option aus Git 1.4.4 (Oktober 2006) .
Siehe Commit e914ef0 (05. Januar 2016) von Eric Wong ( ele828) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 108cb77 , 20. Januar 2016)

Siehe das neue Documentation/git-for-each-ref.txt

Bei Festschreibungs- und Tag-Objekten entsprechen die Felder " Spezial" creatordateund " creatorFelder" dem entsprechenden Tupel "Datum" oder "Name-E-Mail-Datum" aus den Feldern " committeroder" tagger, je nach Objekttyp.
Diese sind für die Bearbeitung einer Mischung aus kommentierten und leichtgewichtigen Tags vorgesehen .

Die Verwendung creatordatefunktioniert also mit Tags:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Oder:

git tag --sort=-creatordate 

Wie ich in " So sortieren Sie Git-Tags nach der Reihenfolge der Versionszeichenfolgen des Formulars rc-XYZW? " Ausführlich erläutere , können Sie eine Sortierreihenfolge hinzufügen git tag(seit Git 2.0, Juni 2014).

Diese Sortierreihenfolge enthält als Feldname (aufgeführt in git for-each-ref) taggerdate . Dies ermöglicht git tag --sort=taggerdate(von DarVar unten erwähnt ).
Als Beispiel wird im git/gitRepo das v2.10.0letzte Tag aufgelistet :

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

Die Standardreihenfolge würde nicht ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0
VonC
quelle
Vielen Dank. Ich habe mich gefragt, warum einige Daten leer waren. Ich vermutete bereits leichte Tags. Ich bin froh, dass ich die Tags dank nicht neu erstellen muss creatordate!
Exhuma
35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Auch schöne Ausgabe von (ohne Datumsfeld):

git log --tags --decorate --simplify-by-decoration --oneline

So zeigen Sie den vollständigen Verlauf mit Abhängigkeiten und gestreiften linearen Commits an (nur wesentliche Ereignisse wie Tagging und Verzweigung / Zusammenführung):

git log --graph --decorate --simplify-by-decoration --oneline --all
Gavenkoa
quelle
Für faule Leute: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"und es funktioniert am besten für mich.
Mateusz
1
Beachten Sie, dass dies nach dem Festschreibungsdatum sortiert ist, nicht nach dem Datum, an dem die Tags erstellt wurden. Die (derzeit) am besten bewertete Antwort von Josh Lee wird nach dem Datum sortiert, an dem das Tag erstellt wurde.
Nathanial Woolls
13
git tag --sort=-taggerdate

Laut Manpage "Präfix - zum Sortieren in absteigender Reihenfolge des Werts".

git tagverwendet die gleichen Sortierschlüssel wie dort git-for-each-ref, wo die Schlüssel dokumentiert sind.

Zamicol
quelle
1
Dies ist wahrscheinlich die richtigste, basierend auf der Frage. Hier ist der Link zu den Dokumenten, in denen die möglichen Sortierfelder
aufgeführt
Diese Antwort berücksichtigt keine Lightweight-Tags, da sie ein leeres "Taggerdate" haben. Andere Antworten mit "creatordate" sind genauer.
Morhook
13

Dieser Einzeiler zeigt Daten und Tags ohne viel Aufhebens an.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Ausgabe:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Wenn Sie nicht möchten, wie Tags standardmäßig sortiert werden, können Sie --sort=creatordatebeispielsweise mit der Option nach Datum sortieren . Weitere Informationen finden Sie unter VonC-Antwort .

elboulangero
quelle
Ist diese nette Methode verpflichtet, sie nach Datum zu sortieren? aufsteigend? absteigend?
Motti Shneor
11

Um kommentierte Tags und Lightweight-Tags basierend auf dem Festschreibungsdatum zu sortieren, verwende ich:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

Dieser Befehl listet jedes Tag und die zugehörige Festschreibungsobjekt-ID in chronologischer Reihenfolge auf.

Yann Droneaud
quelle
Ein bisschen verschleiert. ... In kommentierten Tags ist 'Committerdate' leer, während in Lightweight-Tags 'Taggerdate' leer ist. Um dieses Problem zu umgehen, weist '* committerdate' Git an, Daten aus dem ursprünglichen Commit-Objekt zu referenzieren, wenn es leichtgewichtig ist. ...
ingyhere
Die Verwendung von 'creatordate' sollte effektiv dasselbe tun.
Ingyhere
7

Mit Git version 2.10.0.windows.1

git tag --sort=taggerdate

DarVar
quelle
5

Das Folgende hängt vom Commit ab, daher spielt es keine Rolle, ob es Datumsinformationen mit dem Commit enthält:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

Die obige Antwort von Josh Lee basiert auf einem Tag-Datum, um die richtige Bestellung zu erhalten.

Andrew McGlashan
quelle
Nicht sicher, was der nachfolgende Befehl tacist - könnte ihn in ändern more. Wie auch immer, Ihr Befehl hat großartig funktioniert - danke!
David H
3

Aufbauend auf den zuvor genannten Methoden wollte ich auch das tatsächliche Tag-Datum in der Liste anzeigen. Daher lautet meine verwendete Version:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
Ville
quelle