117 Stimmen

Zeige alle Tags im git log an

Warum zeigt git log --decorate nicht mehr als ein Tag pro Commit an?

EDIT: Charles Bailey hat die Antwort gefunden (zumindest in meinem Fall)
Im Wesentlichen hatte ich ein Tag, das auf ein anderes Tag zeigte, das dann auf den Commit zeigte. Aufgrund dieser zusätzlichen Indirektion wurde das Tag nicht im Log angezeigt. Ich muss das beheben, entweder indem ich unser Tagging-Skript so anpasse, dass es richtig taggt, oder indem ich durch einige Shell-Skript-Voodoo die Tags rekursiv folge. Wie auch immer, ich lasse diese Frage hier nur als Referenz stehen, falls jemand sie benötigt. (Ich bin neu bei Stack Overflow, aber ich gehe davon aus, dass das das richtige Protokoll ist?)

... Originale Frage folgt ...

Hintergrundgeschichte: Wir verwenden GIT bei der Arbeit für die Versionskontrolle und haben ein Politik, bei jeder Bereitstellung einen Commit zu taggen. (Es handelt sich tatsächlich um ein Skript, das Tags setzt und dann den Tag auf dem Server zieht). Da es sich um eine Webanwendung mit separaten Staging- und Produktions-Servern handelt, taggen wir häufig eine Veröffentlichung für das Staging (zum Testen oder was auch immer) und taggen dann später denselben Commit für die Produktion.

Es kommt also tatsächlich sehr häufig vor, dass wir mehrere Tags auf demselben Commit haben. Es wäre sehr schön, dies im Text-Log sehen zu können, aber es scheint nicht unterstützt zu werden. Derzeit umgehe ich das Problem, indem ich manuell das Tag überprüfe, nach dem ich suche, oder indem ich gitk starte. Auch wenn beide Lösungen funktionieren, scheint es mir wirklich seltsam, dass git log --decorate standardmäßig nur ein Tag pro Commit unterstützt.

Ich habe ein wenig gegoogelt, aber nicht viel gefunden. Fehlt mir etwas Offensichtliches?

P.S. (Ich verwende tatsächlich einen benutzerdefinierten Format-String mit %d, gemäß den Man-Seiten und einigen schnellen Tests ist es äquivalent zu --decorate)

111voto

Marcello de Sales Punkte 19324
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Diese Version wird auch die Commit-Nachricht drucken:

 $ 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: Aktualisierung des package.json mit Version 0.6.0 und des README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update des Loggers zum Speichern von Dateien mit optionaler Portnummer, falls definiert/übergeben: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Behebung des Fehlers beim Laden der App mit Gulp und Grunt für 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Fehlende Aktualisierungen des package.json und README.md mit der Version 0.4.1
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Aktualisierung der README.md-Datei mit der neuesten Version 1.3.0.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Unterstützung für benutzerdefinierte Serialisierer hinzufügen: README Aktualisierung
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Beheben eines Fehlers bei der Erstellung der Protokolle
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Bessere Umstrukturierung der Logger, keine Abhängigkeiten, Selbstkonfiguration für fehlende Einstellungen.

16voto

VonC Punkte 1117238

Hinweis zum Tag eines Tags (Tagging eines Tags), der Ihrem Problem zugrunde liegt, wie Charles Bailey im Kommentar richtig bemerkt hat:

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

  • wenn Sie bereits einen Tag gepusht haben, rät die git tag man page ernsthaft davon ab, einfach mit git tag -f B einen Tag-Namen "A" zu ersetzen
  • Versuchen Sie nicht, einen signierten Tag mit git tag -f neu zu erstellen (siehe den untenstehenden Thread)

    (es handelt sich um einen Grenzfall, aber sehr lehrreich bezüglich Tags im Allgemeinen, und stammt von einem anderen Beitragenden von SO Jakub Narebski):

Bitte beachten Sie, dass der Name des Tags (schwerwiegender Tag, d.h. Tag-Objekt) an zwei Stellen gespeichert ist:

  • im Tag-Objekt selbst als Inhalt des 'Tag'-Headers (Sie können ihn in der Ausgabe von "git show " und auch in der Ausgabe von "git cat-file -p " sehen, wobei der schwerwiegende Tag ist, z.B. v1.6.3 im Repository git.git),
  • und auch als Standardname der Tag-Referenz (Referenz im Namespace "refs/tags/*"), die auf ein Tag-Objekt zeigt.
    Beachten Sie, dass die Tag -Referenz (geeignete Referenz im Namespace "refs/tags/*") rein lokal ist; was ein Repository in 'refs/tags/v0.1.3' hat, kann ein anderes zum Beispiel in 'refs/tags/sub/v0.1.3' haben.

Wenn Sie also den signierten Tag 'A' erstellen, haben Sie folgende Situation (unter der Annahme, dass er auf einen bestimmten Commit zeigt)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (Commit)       Tag A
                 (Tag)

Beachten Sie auch, dass "git tag -f A A" (achten Sie auf das Fehlen von Optionen, die es zwingen, ein annotierter Tag zu sein) ein Leerlauf ist - es ändert nichts an der Situation.

Wenn Sie "git tag -f -s A A" ausführen: beachten Sie, dass Sie eine Tag-Überschreibung erzwingen (also geht git davon aus, dass Sie wissen, was Sie tun), und dass eine der Optionen -s / -a / -m verwendet wird, um einen annotierten Tag zu erzwingen (Erstellung eines Tag-Objekts), erhalten Sie 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 zeigen würde...

9voto

VonC Punkte 1117238

Hinweis: Der Commit 5e1361c von Brian M. Carlson (bk2204) (für git 1.9/2.0 Q1 2014) befasst sich mit einem speziellen Fall in Bezug auf Log-Dekorationen mit Tags:

log: Behandlung von Dekorationen mit verschachtelten Tags verbessern

git log hat Dekorationen nicht korrekt behandelt, wenn ein Tag-Objekt auf ein anderes Tag-Objekt verwies, das kein Verweis mehr war, z. B. wenn das zweite Tag gelöscht wurde.
Der Commit wurde nicht korrekt dekoriert, da parse_object nicht auf das zweite Tag angewendet wurde und daher sein Feld "tagged" nicht ausgefüllt war, was dazu führte, dass keines der Tags mit dem relevanten Commit in Verbindung gebracht wurde.

Rufen Sie parse_object auf, um dieses Feld auszufüllen, wenn es fehlt, damit die Kette von Tags aufgelöst und der Commit ordnungsgemäß dekoriert werden kann.
Fügen Sie auch Tests hinzu, 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 kürzer &&
git log --no-walk --tags --pretty="%H %d" --decorate=full

5voto

Gabriel Staples Punkte 20228

Hinweis: Ich spreche nur das Thema der Frage an:

alle Tags im Git-Protokoll anzeigen

...nicht die spezifischen Details der Frage.

Zeigen Sie das vollständige git log (in Farbe!) für jeden markierten Commit:

Ich glaube wirklich, dass dies die nützlichste und schönste Form ist:

git log --no-walk --tags

Es zeigt die vollständige git log Ausgabe für jeden einzelnen Commit, der mit einem Tag versehen ist. Sehr praktisch!

Und wenn Sie nur Tags filtern möchten, die einem bestimmten Suchmuster entsprechen, tun Sie stattdessen dies:

git log --no-walk --tags=*some_string*

Beispiel:

git log --no-walk --tags=*release/my_board*

Zeigen Sie eine 1-Zeilen-Zusammenfassung des git log (in Farbe!) für jeden markierten Commit:

Wenn Sie nur eine Zeile pro markiertem Commit sehen möchten, tun Sie dies stattdessen. Hinweis: Dies ist abgeleitet von Coderwalls schöner git lg Alias:

git log --color --no-walk --tags --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Und natürlich können Sie immer noch nach bestimmten Tags filtern, die Sie mit der Form --tags=*some_string* möchten:

git log --color --no-walk --tags=*some_string* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Beispiel:

git log --color --no-walk --tags=*release/my_board* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Referenzen:

  1. Die Antwort von @Marcello de Sales hat mir den Einstieg erleichtert.
  2. Coderwalls schöner git lg Alias

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X