Alle Tags im Git-Protokoll anzeigen

98

Warum wird git log --decoratenicht mehr als ein Tag pro Commit angezeigt?

EDIT : Charles Bailey hat die Antwort gefunden (zumindest in meinem Fall).
Im Wesentlichen hatte ich ein Tag, das auf ein anderes Tag zeigte, das auf das Commit zeigte. Aufgrund dieser zusätzlichen Indirektionsebene wurde das Tag nicht im Protokoll angezeigt. Ich muss dies beheben, indem ich unser Tagging-Skript so korrigiere, dass es korrekt taggt, oder durch ein Shell-Skript-Voodoo, um Tags rekursiv zu folgen. Wie auch immer, ich lasse diese Frage nur als Referenz, falls jemand sie möchte. (Ich bin neu im Stapelüberlauf, aber ich gehe davon aus, dass dies das richtige Protokoll ist?)

... Originalfrage folgt ...

Hintergrundgeschichte: Wir verwenden GIT bei der Arbeit für die Quellcodeverwaltung und haben die Richtlinie, bei der Bereitstellung immer ein Commit zu kennzeichnen. (Es ist eigentlich ein Skript, das Tags erstellt und dann das Tag auf dem Server abruft.) Da es sich um eine Webanwendung mit separaten Staging- und Produktionsservern handelt, kennzeichnen wir häufig eine Version für das Staging (zum Testen oder was auch immer) und später das gleiche Commit für die Produktion.

Es kommt also sehr oft vor, dass wir mehrere Tags auf demselben Commit haben. Es wäre sehr schön, dies im Textprotokoll zu sehen, aber es scheint es nicht zu unterstützen. Ich arbeite derzeit an dem Problem, indem ich das gesuchte Tag manuell überprüfe oder es starte gitk. Obwohl beide Lösungen funktionieren, scheint es mir wirklich seltsam git log --decorate, standardmäßig nur ein Tag pro Commit zu unterstützen.

Ich habe ein bisschen gegoogelt, aber nicht viel gefunden. Vermisse ich etwas Offensichtliches?

PS (Ich verwende tatsächlich eine benutzerdefinierte Formatzeichenfolge %d, die laut Manpages und einigen Schnelltests gleichbedeutend ist mit --decorate)

Jonathan
quelle
12
Haben Sie versucht, 'git log --decorate = full' (minus Anführungszeichen)?
RDL
1
Welche Version von Git verwenden Sie? Ich sehe mehrere Tags in meinem.
Cascabel
@RDL: full bringt es dazu, Refs / Heads / oder Refs / Tags / nach Bedarf zu drucken, oder? Nicht mehr oder weniger Refs.
Cascabel
9
Kurze Frage, markieren Sie die Tags oder markieren Sie das Commit? (Tags können Ketten bilden, in meinen Tests wurden Tags verziert, die auf ein Commit zeigen, und Tags, die auf ein Tag zeigen, aber nicht weiter als das.)
CB Bailey
1
@ Charles Bailey Ich denke, Sie haben das Problem möglicherweise gefunden. Ich habe einen einfachen Test bei der Arbeit versucht (Git-Version 1.6.3.3), und es scheint in Ordnung zu funktionieren. Es handelt sich also nicht um ein Versionsproblem. Ich werde später mehr untersuchen. Danke für den Einblick!
Jonathan

Antworten:

17

Hinweis zum Tag des Tags (Markieren eines Tags), der den Ursprung Ihres Problems darstellt, wie Charles Bailey im Kommentar richtig hervorgehoben hat:

Stellen Sie sicher, dass Sie diesen Thread studieren , da das Überschreiben eines signierten Tags nicht so einfach ist:

  • Wenn Sie bereits ein Tag gepusht haben, hat die git tagManpage ernsthaft davon abgeraten git tag -f B, einen Tag-Namen einfach zu ersetzen. " A"
  • Versuchen Sie nicht, ein signiertes Tag mit neu zu erstellen git tag -f(siehe den Thread-Auszug unten).

    (Es handelt sich um einen Eckfall , ist aber in Bezug auf Tags im Allgemeinen recht lehrreich und stammt von einem anderen SO-Mitarbeiter, Jakub Narębski. )

Bitte beachten Sie, dass der Name des Tags (Schwergewichts-Tag, dh Tag-Objekt) an zwei Stellen gespeichert wird:

  • im Tag-Objekt selbst als Inhalt des 'Tag'-Headers (Sie können es in der Ausgabe von " git show <tag>" und auch in der Ausgabe von " git cat-file -p <tag>" sehen, wobei <tag>es sich um ein schweres Tag handelt, z. B. v1.6.3im git.gitRepository),
  • und ist auch der Standardname der Tag-Referenz (Referenz im refs/tags/*Namespace " "), die auf ein Tag-Objekt verweist.
    Beachten Sie, dass die Tag- Referenz (entsprechende Referenz im refs/tags/*Namespace " ") rein lokal ist. Was ein Repository in ' refs/tags/v0.1.3' hat, kann ein anderes in ' refs/tags/sub/v0.1.3' haben.

Wenn Sie also ein signiertes Tag ' A' erstellen , haben Sie die folgende Situation (vorausgesetzt, es zeigt auf ein Commit)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

Bitte beachten Sie auch, dass " git tag -f A A" (beachten Sie das Fehlen von Optionen, die es zwingen, ein mit Anmerkungen versehenes Tag zu sein) ein Noop ist - es ändert nichts an der Situation.

Wenn Sie " git tag -f -s A A" tun : Beachten Sie, dass Sie das Schreiben eines Tags erzwingen (git setzt also voraus, dass Sie wissen, was Sie tun) und dass eine der Optionen -s/ -a/ -mverwendet wird, um ein mit Anmerkungen versehenes Tag zu erzwingen (Erstellung eines Tag-Objekts) folgende Situation

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

Beachten Sie auch, dass " git show A" die gesamte Kette bis zum Nicht-Tag-Objekt anzeigen würde ...

VonC
quelle
86
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Diese Version druckt auch die Festschreibungsnachricht:

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.
Marcello de Sales
quelle
2
Noch besser ist es, einen Alias ​​dafür zu erstellen :) git config --global alias.tags "! Git log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
GOXR3PLUS
1
Danke @ GOXR3PLUS. Ich musste tun: git config --global alias.tags "log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
ajh158
8

Hinweis: Das Commit 5e1361c von Brian M. carlson ( bk2204) (für git 1.9 / 2.0 Q1 2014) befasst sich mit einem Sonderfall in Bezug auf die Holzdekoration mit Tags:

log: Dekorationen mit verketteten Tags richtig handhaben

git logDekorationen wurden nicht korrekt behandelt, wenn ein Tag-Objekt auf ein anderes Tag-Objekt verwies, das nicht mehr als Referenz diente, z. B. wenn das zweite Tag gelöscht wurde .
Das Commit würde nicht korrekt dekoriert, da parse_objectdas zweite Tag nicht aufgerufen wurde und daher das mit Tags versehene Feld nicht ausgefüllt wurde, was dazu führte, dass keines der Tags dem entsprechenden Commit zugeordnet wurde.

Rufen Sie parse_objectan, um dieses Feld auszufüllen, wenn es nicht vorhanden ist, damit die Kette von Tags dereferenziert und das Commit ordnungsgemäß dekoriert werden kann.
Schließen Sie auch Tests ein, um zukünftige Regressionen zu verhindern.

Beispiel:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full
VonC
quelle