Warum sollte ich mich für leichte oder kommentierte Tags interessieren?

346

Ich habe letztes Jahr als mein tägliches VCS von Subversion zu Git gewechselt und versuche immer noch, die Feinheiten von "Git-think" zu erfassen.

Das, was mich in letzter Zeit gestört hat, ist "leicht" vs. kommentiert vs. signiert. Es scheint allgemein anerkannt zu sein, dass kommentierte Tags für alle realen Verwendungszwecke den leichtgewichtigen Tags überlegen sind, aber die Erklärungen, die ich dafür gefunden habe, warum dies der Fall ist, scheinen sich immer entweder auf "weil Best Practices" oder "weil sie unterschiedlich sind" zu beschränken. . Leider sind dies sehr unbefriedigende Argumente, ohne zu wissen, warum es sich um Best Practices handelt oder wie diese Unterschiede für meine Git-Nutzung relevant sind .

Als ich zum ersten Mal zu Git wechselte, schienen leichte Tags das Beste seit geschnittenem Brot zu sein. Ich könnte einfach auf ein Commit zeigen und sagen "das war 1.0". Ich habe Probleme zu verstehen, wie ein Tag jemals mehr sein muss, aber ich kann nicht glauben, dass die Git-Experten der Welt willkürlich kommentierte Tags bevorzugen! Worum geht es also im Trubel?

(Bonuspunkte: Warum sollte ich jemals ein Tag unterschreiben müssen?)

BEARBEITEN

Ich war erfolgreich davon überzeugt, dass kommentierte Tags eine gute Sache sind - zu wissen, wer wann getaggt hat, ist wichtig! Irgendwelche Ratschläge zu guten Tag-Anmerkungen? Beides git tag -am "tagging 1.0" 1.0und der Versuch, das Festschreibungsprotokoll seit dem vorherigen Tag zusammenzufassen, scheinen Strategien zu verlieren.

Ben Blank
quelle
Haben Sie eine gute Antwort für Ihr Follow-up gefunden? Etwas wie? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
Bangalore
Das Zusammenfassen des Festschreibungsprotokolls seit dem vorherigen Tag scheint mir eine hervorragende Strategie für Tag-Nachrichten zu sein.
Rooby
Zu Ihrer Information (1.) Um das LIGHTWEIGHT-Tag nach Datum aufzulisten, klicken Sie hier . (2.) Um das ANNOTATED-Tag nach Datum aufzulisten, klicken Sie hier .
Trevor Boyd Smith

Antworten:

272

Das große Plus eines mit Anmerkungen versehenen Tags ist, dass Sie wissen, wer es erstellt hat. Genau wie bei Commits ist es manchmal schön zu wissen, wer es getan hat. Wenn Sie ein Entwickler sind und sehen, dass v1.7.4 markiert wurde (für bereit erklärt wurde) und Sie nicht so sicher sind, mit wem sprechen Sie? Die Person, deren Name im kommentierten Tag steht! (Wenn Sie in einer misstrauischen Welt leben, hindert dies die Menschen auch daran, Dinge zu markieren, die sie nicht sollten.) Wenn Sie ein Verbraucher sind, ist dieser Name ein Stempel der Autorität: Das ist Junio ​​Hamano, der sagt, dass diese Version von git hiermit ist veröffentlicht.

Die anderen Metadaten können ebenfalls hilfreich sein - manchmal ist es schön zu wissen, wann diese Version veröffentlicht wurde, nicht nur, wann das endgültige Commit durchgeführt wurde. Und manchmal kann die Nachricht sogar nützlich sein. Vielleicht hilft es, den Zweck dieses bestimmten Tags zu erklären. Möglicherweise enthält das Tag für einen Release-Kandidaten eine Status- / Aufgabenliste.

Das Signieren von Tags ähnelt dem Signieren von anderen Elementen - es bietet dem Paranoiden eine weitere Sicherheitsstufe. Die meisten von uns werden es nie verwenden, aber wenn Sie wirklich alles überprüfen möchten, bevor Sie diese Software auf Ihren Computer stellen, möchten Sie es vielleicht.

Bearbeiten:

Was Sie in eine Tag-Annotation schreiben sollen, haben Sie Recht - es gibt nicht immer viel Nützliches zu sagen. Für ein Versionsnummern-Tag wird implizit verstanden, dass es diese Version markiert, und wenn Sie mit Ihren Änderungsprotokollen an anderer Stelle zufrieden sind, müssen Sie dort keine einfügen. In diesem Fall sind wirklich der Tagger und das Datum am wichtigsten. Das einzige andere, woran ich denken kann, ist eine Art Gütesiegel einer Testsuite. Schauen Sie sich die Tags von git.git an: Alle sagen nur etwas wie "Git 1.7.3 rc1"; Alles, was uns wirklich wichtig ist, ist Junio ​​Hamanos Name auf ihnen.

Bei weniger offensichtlich benannten Tags könnte die Nachricht jedoch viel wichtiger werden. Ich könnte mir vorstellen, eine bestimmte Spezialversion für einen einzelnen Benutzer / Client, einen wichtigen Meilenstein ohne Version oder (wie oben erwähnt) einen Release-Kandidaten mit zusätzlichen Informationen zu versehen. Die Nachricht ist dann viel nützlicher.

Cascabel
quelle
4
Nur zum Vergleich mit SVN, da das OP von diesem System stammt: Die mit Anmerkungen versehenen Tag-Metadaten entsprechen der tatsächlichen SVN-Änderung, die den Tag-Zweig bewirkt, der in SVN einen eigenen Autor und eine eigene Nachricht hat. Und möglicherweise separate Einschränkungen, wer ein Tag erstellen darf, und nicht, wer Änderungen einchecken darf - eine Unterscheidung, die irrelevant ist, wenn Sie das System nur für Ihre eigenen Zwecke verwenden.
Araqnid
10
Ah-ha! Es hört sich so an, als ob mein Verständnis hier durch die Tatsache behindert wurde, dass alle meine Git-Projekte bisher solo waren. Ich musste nie wissen, wer für etwas verantwortlich ist (ich bin es immer!), Daher hatte ich nicht bemerkt, dass leichte Tags den Tagger nicht verfolgen.
Ben Blank
5
git help logFasst dies nun wie folgt zusammen: "Kommentierte Tags sind für die Freigabe vorgesehen, während Lightweight-Tags für private oder temporäre Objektbezeichnungen vorgesehen sind."
Jon Gjengset
1
@javabrett Während dies ein guter Teil einer Antwort auf "Was sind die Unterschiede zwischen kommentierten und leichtgewichtigen Tags?" ist, war die Frage hier speziell, warum Benutzer zusätzliche Informationen speichern und daher kommentierte Tags verwenden möchten. (Und ich glaube nicht, dass ich ernsthaft sagen könnte, dass "es einen Blob erzeugt" ein Nachteil ist - Sie tun, was Sie tun müssen, um die Informationen zu speichern, die Sie speichern möchten, und wenn es sich um wichtige Informationen handelt, ist ein Blob erforderlich. )
Cascabel
1
@ Chris ja, wie die Antwort sagt: "Das große Plus eines mit Anmerkungen versehenen Tags ist, dass Sie wissen, wer es erstellt hat." Sie können immer selbst versuchen, um herauszufinden:git tag -a -m 'my message' my-tag; git show my-tag
Cascabel
64

Meine persönliche, etwas andere Ansicht zu diesem Thema:

  • Kommentierte Tags sind Tags, die für andere Entwickler veröffentlicht werden sollen, höchstwahrscheinlich neue Versionen (die ebenfalls signiert werden sollten). Nicht nur um zu sehen, wer markiert hat und wann es markiert wurde, sondern auch warum (normalerweise ein Änderungsprotokoll).
  • Lightweight eignet sich eher für den privaten Gebrauch. Das bedeutet, dass spezielle Commits markiert werden, um sie wiederfinden zu können. Möge es sein, sie zu überprüfen, sie auszuprobieren, um etwas oder was auch immer zu testen.
Koraktor
quelle
4
Dies wird auch auf man git-tag erwähnt: "Kommentierte Tags sind für die Freigabe vorgesehen, während Lightweight-Tags für private oder temporäre Objektbezeichnungen vorgesehen sind.": Stackoverflow.com/a/35059291/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
28

Standardmäßig betrachtet Git kommentierte Tags nur als Basis für Befehle wie git describe. Stellen Sie sich kommentierte Tags als Wegweiser vor, die für Sie und andere eine dauerhafte Bedeutung haben, während leichte Tags eher wie Lesezeichen für Ihr späteres Selbst sind. Kommentierte Tags sollten daher als Referenz verwendet werden, während leichte Tags dies nicht sein sollten.

Das Signieren eines Tags ist eine Garantie für die Identität des Unterzeichners. Damit können Benutzer beispielsweise überprüfen, ob der von ihnen aufgenommene Linux-Kernel-Code derselbe Code ist, den Linus Torvalds tatsächlich veröffentlicht hat. Die Signatur kann auch eine Behauptung sein, dass der Unterzeichner bei diesem Commit für die Qualität und Integrität der Software bürgt.

Phil Miller
quelle
1
git push --follow-tagsist ein weiterer Befehl, der beide unterschiedlich behandelt: stackoverflow.com/a/26438076/895245
Ciro Santilli 6 冠状 病 六四. 法轮功
1
Danke für den Hinweis über git describe. Ich benutze es im kontinuierlichen Integrationssystem und ein paar Mal war die Versionszeichenfolge nicht das, was ich erwartet hatte.
Jjmontes
9

Das Signieren eines Tags ist eine einfache Möglichkeit, die Authentizität einer Version zu bestätigen.

Dies ist besonders in einem DVCS nützlich, da jeder das Repository klonen und den Verlauf ändern kann (z. B. über den Git-Filter-Zweig). Wenn ein Tag signiert ist, überlebt die Signatur eine Git-Filter-Verzweigungsoperation nicht. Wenn Sie also die Richtlinie haben, dass jede Version von einem Committer markiert und signiert wird, können Sie ein falsches Release-Tag im Repository erkennen.

Ohne das Signieren würde ich auch in kommentierten Tags nicht viel Sinn sehen.

cwilper
quelle
1
Eigentlich könnte es dafür nützlich sein, eine Signatur zu haben, die nur den festgeschriebenen Baum signiert, nicht den gesamten Verlauf (es ist mir egal, ob jemand den Verlauf manipuliert hat, ich möchte nur sicher sein, dass ich den richtigen Code habe).
Paŭlo Ebermann
9

Schieben Sie kommentierte Tags, und halten Sie sie leicht lokal

Bestimmte Git-Verhaltensweisen unterscheiden sie in einer Weise, dass diese Empfehlung nützlich ist, z.

  • Mit Anmerkungen versehene Tags können eine Nachricht, einen Ersteller und ein Datum enthalten, die sich von dem Commit unterscheiden, auf das sie verweisen. Sie können sie also verwenden, um ein Release zu beschreiben, ohne ein Release-Commit durchzuführen.

    Lightweight-Tags verfügen nicht über diese zusätzlichen Informationen und benötigen sie auch nicht, da Sie sie nur selbst zum Entwickeln verwenden.

  • git push --follow-tags pusht nur kommentierte Tags
  • git describe Ohne Befehlszeilenoptionen werden nur kommentierte Tags angezeigt

man git-tag sagt:

Mit Anmerkungen versehene Tags sind für die Freigabe vorgesehen, während Lightweight-Tags für private oder temporäre Objektbezeichnungen vorgesehen sind.

Interne Unterschiede

  • Sowohl Lightweight- als auch Annotated-Tags sind eine Datei .git/refs/tags, die einen SHA-1 enthält

  • Bei Lightweight-Tags verweist der SHA-1 direkt auf ein Commit:

    git tag light
    cat .git/refs/tags/light
    

    druckt das gleiche wie der SHA-1 des KOPFES.

    Kein Wunder also, dass sie keine anderen Metadaten enthalten können.

  • Mit Anmerkungen versehene Tags verweisen auf ein Tag-Objekt in der Objektdatenbank.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    enthält die SHA des mit Anmerkungen versehenen Tag-Objekts:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    und dann können wir seinen Inhalt erhalten mit:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    Beispielausgabe:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Und so enthält es zusätzliche Metadaten. Wie wir aus der Ausgabe sehen können, sind die Metadatenfelder:

    Eine detailliertere Analyse des Formats finden Sie unter: Was ist das Format eines Git-Tag-Objekts und wie berechnet man seinen SHA?

Boni

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
6

Ich habe die einzige gute Verwendung für leichte Tags gefunden - im Nachhinein eine Veröffentlichung bei GitHub zu erstellen.

Wir haben unsere Software veröffentlicht und hatten die notwendigen Commits. Wir haben uns einfach nicht die Mühe gemacht, den Abschnitt 'Release' auf dem GitHub zu pflegen. Und als wir dem ein wenig Aufmerksamkeit schenkten, wurde uns klar, dass wir auch einige frühere Releases hinzufügen möchten, mit korrekten alten Release-Daten für sie.

Wenn wir nur ein mit Anmerkungen versehenes Tag für ein altes Commit erstellen würden, würde GitHub das Datum für die Freigabe aus dem Tag-Objekt übernehmen. Im Gegensatz dazu wurde in der Version das richtige (alte) Datum angezeigt, als wir ein leichtes Tag für dieses alte Commit erstellt haben. Source @ GitHub-Hilfe, 'Über Releases'

Es scheint auch möglich zu sein, das gewünschte Datum für ein kommentiertes Commit anzugeben, aber für mich sieht es nicht so einfach aus: https://www.kernel.org/pub/software/scm/git/docs/git-tag. html # _on_backdating_tags

evilkos
quelle
Obwohl ich heute herausgefunden habe, dass GitHub die Tag-Daten für mich nicht mehr berücksichtigt (sowohl für leichte als auch für kommentierte Tags). Es ignoriert nur das Datum bei der Veröffentlichung der Veröffentlichung und merkt sich stattdessen das Datum und die Uhrzeit, zu der ich die Schaltfläche "Veröffentlichen" für die Veröffentlichung gedrückt habe.
Evilkos
Ja, ich bin auch auf dieses Durcheinander über GitHub und kommentierte Tags gestoßen. Ich habe nicht verstanden, warum sie es so implementiert haben.
YakovL
1

In meinem Büro werden wir die Adresse der Release-Webseite in den Tag-Body einfügen. Auf der Release-Webseite werden die verschiedenen neuen Funktionen und Korrekturen seit der letzten Version beschrieben. Das Management wird nicht im Git-Repo nachsehen, um herauszufinden, welche Änderungen vorgenommen wurden, und es ist schön, eine kurze Liste der Inhalte dieser Version zu haben.

David
quelle
0

Mit Anmerkungen versehene Tags speichern zusätzliche Metadaten wie Autorenname, Versionshinweise, Tag-Nachricht und Datum als vollständige Objekte in der Git-Datenbank. All diese Daten sind wichtig für eine öffentliche Veröffentlichung Ihres Projekts.

Git-Tag -a v1.0.0

Leichte Tags sind die einfachste Möglichkeit, Ihrem Git-Repository ein Tag hinzuzufügen, da sie nur den Hash des Commits speichern, auf das sie verweisen. Sie können sich wie "Lesezeichen" für ein Commit verhalten und eignen sich daher hervorragend für den privaten Gebrauch.

Git-Tag v1.0.0

Sie können alte Tags sortieren, auflisten, löschen, anzeigen und bearbeiten. Mit all diesen Funktionen können Sie bestimmte Release-Versionen Ihres Codes identifizieren. Ich habe diesen Artikel gefunden, der Ihnen helfen könnte, eine bessere Vorstellung davon zu bekommen, was Tags tun können.

Nesha Zoric
quelle
0

Für mich ist ein wichtiger Unterschied, dass ein leichtes Tag keinen Zeitstempel hat. Angenommen, Sie haben mehrere Lightweight-Tags hinzugefügt:

git tag v1
git tag v2
git tag v3

und dann, vielleicht später, möchten Sie das letzte hinzugefügte Lightweight-Tag erhalten. Es gibt keine Möglichkeit, dies zu tun. Weder "git beschreiben" noch "git tag" geben Ihnen kein chronologisch letztes leichtes Tag. "git tag -l" kann alle zurückgeben oder in lex-Reihenfolge sortieren, jedoch nicht nach Datum / Uhrzeit. "git description --tags" gibt "v1" zurück, was definitiv nicht das zuletzt hinzugefügte Tag ist.

Wenn Sie dagegen kommentierte Tags hinzufügen:

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

Sie können immer einen Zeitstempel für jedes Tag erhalten und "git description" gibt sicher "v3" zurück, das wirklich das zuletzt hinzugefügte Tag ist.

Ezh
quelle
Sie müssen -a verwenden, damit es mit Anmerkungen versehen wird.
Alex