Wie kann ich feststellen, ob ein bestimmtes Git-Tag mit Anmerkungen versehen oder leichtgewichtig ist?

77

Ich tippe git tagund es listet meine aktuellen Tags auf:

1.2.3
1.2.4

Wie kann ich feststellen, welche davon mit Anmerkungen versehen und welche leicht sind?

G. Sylvie Davies
quelle
3
tut git tag -netwas für dich
Oxymoron
Eine Tag-Annotation ist keine Commit-Nachricht. Sie können es nicht mit git-log (1) sehen; Sie müssen Git-Show (1)
Oxymoron
Git Tag -n war interessant! Aber es ist nicht kugelsicher für mein spezifisches Problem.
G. Sylvie Davies
1
Ich mag "git show-ref -d --tags".
G. Sylvie Davies

Antworten:

54

git for-each-refHier erfahren Sie, was jede Referenz standardmäßig ist, ihre ID und ihren Typ. Um es auf nur Tags zu beschränken, tun Sie dies git for-each-ref refs/tags.

Die Ausgabe besteht aus drei Feldern: dem Hash eines Objekts, dem Typ des Objekts und dem Namen in refs / tags, der sich auf das Objekt bezieht. Ein sogenanntes "leichtes" Tag ist ein Name in refs / tags, der sich auf ein commitObjekt bezieht . Ein "kommentiertes" Tag ist ein Name in refs / tags, der auf ein tagObjekt verweist .

- Solomon Slow (in den Kommentaren)

Hier ist ein Beispiel:

git for-each-ref refs/tags                                           
902fa933e4a9d018574cbb7b5783a130338b47b8 commit refs/tags/v1.0-light
1f486472ccac3250c19235d843d196a3a7fbd78b tag    refs/tags/v1.1-annot
fd3cf147ac6b0bb9da13ae2fb2b73122b919a036 commit refs/tags/v1.2-light
jthill
quelle
7
Als ich dies versuchte, listete die Ausgabe jedes Tag entweder als a commitoder a auf tag. Ich nehme an, diese weisen auf leichte bzw. mit Anmerkungen versehene Tags hin.
Stevoisiak
4
@StevenVascellaro Das ist richtig, ein leichtes Tag ist nur die lokale Referenz, die mit "refs / tags" beginnt. Es kann sich um alles handeln. Ein Tag in der Objektdatenbank hat mehr als nur einen Namen und kann wie jedes andere Objekt versendet werden. Git erstellt lokale Verweise für jedes Tag in der Objektdatenbank, sodass die Unterscheidung etwas unscharf ist. Im Allgemeinen muss sich niemand mehr darum kümmern, sobald der Workflow für sein Projekt eingerichtet ist.
Bis zum
3
Ist commitalso leicht und tagmit Anmerkungen versehen?
Pontiacks
6
@Pontiacks, die Ausgabe hat drei Felder: Der Hash eines Objekts, der Typ des Objekts und der Name in refs / tags, der sich auf das Objekt bezieht. Ein sogenanntes "leichtes" Tag ist ein Name in refs / tags, der sich auf ein commitObjekt bezieht . Ein "kommentiertes" Tag ist ein Name in refs / tags, der auf ein tagObjekt verweist .
Solomon Slow
44

Der git show-ref -d --tagsBefehl erledigt dies, da Lightweight-Tags einmal in der Ausgabe und annotierte Tags zweimal vorkommen. Außerdem enthalten nur mit Anmerkungen versehene Tags den Dereferenzierungsoperator "^ {}" in der Ausgabe.

588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.3
7fe2caaed1b02bb6dae0305c5c0f2592e7080a7a refs/tags/1.2.4
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.4^{}

Und diese Ausgabe kann dann mit den Befehlen unix sort, sed, cut und uniq massiert werden, um die Ausgabe besser lesbar zu machen:

git show-ref -d --tags       | 
cut -b 42-                   | # to remove the commit-id
sort                         |
sed 's/\^{}//'               | # remove ^{} markings
uniq -c                      | # count identical lines
sed 's/2\ refs\/tags\// a /' | # 2 identicals = annotated
sed 's/1\ refs\/tags\//lw /'   

Für mein ursprüngliches Repo (aus meiner Frage) wird Folgendes ausgegeben:

  lw 1.2.3
   a 1.2.4

(zB war 1.2.3 "leicht" und "1.2.4" wurde kommentiert).

G. Sylvie Davies
quelle
26

Holen Sie sich den Tag-Namen (sagen wir foo) und machen Sie dann a git cat-file -t foo. Wenn es sich um ein mit Anmerkungen versehenes Tag handelt, cat-filewird Ihnen mitgeteilt, dass es sich um ein "Tag" handelt. Wenn es sich um ein einfaches Tag handelt, cat-filewird Ihnen mitgeteilt, dass es sich um ein "Commit" handelt.

Update: Wie Oxymoron in seinem Kommentar sagte, git showfunktioniert es auch, aber es gibt Ihnen mehr Informationen als nur, um welche Art von Tag es sich handelt.

Noufal Ibrahim
quelle
2
Für "ein bestimmtes Tag" (wie in der Frage angegeben) scheint dies bei weitem die beste Antwort zu sein.
Phils
1
Hervorragende Antwort - der Schlüssel dazu ist die Option "-t" in "git cat-file". In der Manpage wird Folgendes erläutert: "-t Zeigen Sie anstelle des Inhalts den durch <Objekt> gekennzeichneten Objekttyp an."
G. Sylvie Davies
14

Bitte versuchen Sie es mit git describe

https://git-scm.com/docs/git-describe

Standardmäßig (ohne --all oder --tags) zeigt git description nur kommentierte Tags an.

Oxymoron
quelle