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.0
und der Versuch, das Festschreibungsprotokoll seit dem vorherigen Tag zusammenzufassen, scheinen Strategien zu verlieren.
git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
Antworten:
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.
quelle
git help log
Fasst 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."git tag -a -m 'my message' my-tag; git show my-tag
Meine persönliche, etwas andere Ansicht zu diesem Thema:
quelle
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.
quelle
git push --follow-tags
ist ein weiterer Befehl, der beide unterschiedlich behandelt: stackoverflow.com/a/26438076/895245git describe
. Ich benutze es im kontinuierlichen Integrationssystem und ein paar Mal war die Versionszeichenfolge nicht das, was ich erwartet hatte.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.
quelle
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 describe
Ohne Befehlszeilenoptionen werden nur kommentierte Tags angezeigtman git-tag
sagt:Interne Unterschiede
Sowohl Lightweight- als auch Annotated-Tags sind eine Datei
.git/refs/tags
, die einen SHA-1 enthältBei Lightweight-Tags verweist der SHA-1 direkt auf ein Commit:
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.
enthält die SHA des mit Anmerkungen versehenen Tag-Objekts:
und dann können wir seinen Inhalt erhalten mit:
Beispielausgabe:
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
Bestimmen Sie, ob ein Tag mit Anmerkungen versehen ist:
Ausgänge
commit
für Leichtgewicht,tag
für Anmerkungen.Nur Lightweight-Tags auflisten: Wie kann ich alle Lightweight-Tags auflisten?
quelle
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
quelle
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.
quelle
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.
quelle
Für mich ist ein wichtiger Unterschied, dass ein leichtes Tag keinen Zeitstempel hat. Angenommen, Sie haben mehrere Lightweight-Tags hinzugefügt:
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:
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.
quelle