2016-10-10 1 views
4

Ich möchte den Zeitunterschied zwischen dem Zeitpunkt, zu dem ein Commit gemacht wurde und dem Tag, an dem dieser Commit getaggt wurde, herausfinden.Wie kann ich den Zeitunterschied zwischen dem Git-Tag und dem ursprünglichen Commit ermitteln?

Das habe ich bisher aber das committerdate was ich denke das ist das richtige Feld ist null.

Bei einer Schätzung schaue ich nur auf Tags, obwohl ich es nicht richtig verstehe. In einer idealen Welt würde es den Unterschied zwischen den Zeiten zeigen, aber ich kann das später tun, wenn es nicht möglich ist.

+0

Tags ... ein leichtes eine oder eine mit Anmerkungen versehene ein? (https://git-scm.com/book/en/v2/Git-Basics-Tagging#Annotated-Tags) – VonC

+0

Diese sind mit Anmerkungen versehene Umbauten, die über Teamstadt eingestellt werden – John

Antwort

3

The git for-each-ref documentation ist eine Art irreführend:

Für begehen und Tag-Objekte, die speziellen creatordate und creator Felder mit dem entsprechenden Datum oder Name-E-Mail-date Tupel aus den committer oder tagger Feldern in Abhängigkeit von der entsprechen werden Objekttyp. Diese sind für die Arbeit an einer Mischung aus annotierten und leichten Tags gedacht.

Dies funktioniert genau so, wie dokumentiert: %(creatordate) das Datum aus dem tagger Feld dieser kommentierten Tags bekommt. Es scheint jedoch, implizieren, dass Git für eine kommentierte Tag, könnte die entsprechende Commit prüfen: wenn nicht, wie würde es jemals die committer bekommen?

Tatsächlich sieht for-each-ref nie direkt bei einem Zielobjekt des annotierten Tags. Die Erwähnung des Felds committer ist spezifisch für leichte Tags, die auf Commits, eher als annotierte Tag-Objekte verweisen. Glücklicherweise gibt es eine Formatrichtlinie, die sagt, dass sie "indirekt" aussehen soll: Einfach der Direktive * voranstellen.

Daraus ergibt sich die Antwort lautet:

git for-each-ref \ 
    --format='%(taggerdate) : %(*committerdate) : %(refname)' \ 
    --sort=-taggerdate --count=10 refs/tags 

Leichte Tags direkt an Bäumen oder Blobs zeigen können; Es ist nicht sofort klar, was in diesem Fall passiert. Wahrscheinlich ist die Erweiterung leer.

Beachten Sie, dass dies nur Indirects einmal, so dass, wenn das Ziel des kommentierten Tages ist ein weiterer Tag (oder ist ein Baum oder Blob), wird es kein Committer Datumsfeld sein. Um dies wirklich zuverlässig zu machen, sollten Sie wahrscheinlich ein bisschen Shell-Skript verwenden und den Tag-Namen mit dem ^{} oder ^{commit} Suffix auflösen. (Der Unterschied zwischen diesen beiden ist, dass ^{commit} wird scheitern wenn das ultimative Ziel-Objekt ein Baum oder Blob ist, während ^{} gelingen wird, zu finden, diesen Baum oder Blob-Objekt.)

+0

Perfect danke – John

Verwandte Themen