Was ist der einfachste Weg, um das neueste Tag in Git zu erhalten?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
Ausgabe:
a
b
c
Sollte ich ein Skript schreiben, um die Datums- und Uhrzeitangaben jedes Tags abzurufen und zu vergleichen?
git
git-checkout
git-tag
getlatest
culebrón
quelle
quelle
Antworten:
Sie könnten einen Blick darauf werfen
git describe
, was etwas in der Nähe von dem tut, was Sie fragen.quelle
--abbrev=0
sollte das nächste kommentierte Tag zurückgegeben werdengit describe --exact-match --abbrev=0
.git describe --tags
und vergleichen Sie com letzten Tag in Github Release-SeiteSo erhalten Sie das neueste Tag:
So erhalten Sie das neueste mit Anmerkungen versehene Tag:
quelle
git describe
sagt:--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Gibt das Tag des letzten getaggten Commits in allen Zweigen aus
quelle
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ William-PursellUm das neueste Tag zu erhalten, haben Sie folgende Möglichkeiten:
Natürlich können Sie das count-Argument oder das Sortierfeld nach Bedarf ändern. Es scheint, dass Sie beabsichtigt haben, eine etwas andere Frage zu stellen, aber dies beantwortet die Frage so, wie ich sie interpretiere.
quelle
--sort=-authordate
und in derselben Reihenfolge erstellt--sort=authordate
.--sort=-taggerdate
. Für Tagsauthordate
undcommitterdate
sind leer (so nutzlos wie Sortierschlüssel).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
ist noch besser :)--points-at=$SHA
Sie erhalten das Tag für einen Commit-Hash.Wie wäre es damit?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Technisch gesehen erhalten Sie nicht unbedingt das neueste Tag, sondern das neueste Commit, das mit Tags versehen ist, und das möglicherweise das ist, wonach Sie suchen.
quelle
--tags=<pattern>
inrev-list
. Zum Beispiel erhalten Sie das letzte Versions-Taggit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Sie können Folgendes ausführen:
git describe --tags $(git rev-list --tags --max-count=1)
hier gesprochen: Wie erhalte ich den neuesten Tag-Namen?quelle
git describe ...
gibt ein früheres Tag zurück?!)--abbrev=0
Antworten und sie schnitten einen Teil des Tags ab, den ich will."Neueste" könnte zwei Bedeutungen in Bezug auf Git haben.
Sie könnten bedeuten, "welches Tag das späteste Erstellungsdatum hat", und die meisten Antworten hier beziehen sich auf diese Frage. In Bezug auf Ihre Frage möchten Sie Tag zurückgeben
c
.Oder Sie könnten bedeuten, "welches Tag in der Entwicklungsgeschichte einem benannten Zweig am nächsten kommt", normalerweise dem Zweig, in dem Sie sich befinden
HEAD
. In Ihrer Frage würde dies ein Tag zurückgebena
.Diese können natürlich anders sein:
Stellen Sie sich vor dem Entwickler tag'ed
Z
wiev0.2
am Montag, und dann tag'edQ
alsv0.1
am Dienstag.v0.1
ist die neuere, ist aberv0.2
in der Entwicklungsgeschichte näher an HEAD, in dem Sinne, dass der Weg, auf dem sie sich befindet, an einem Punkt beginnt, der näher an HEAD liegt.Ich denke, Sie möchten normalerweise diese zweite Antwort, näher in der Entwicklungsgeschichte. Sie können dies herausfinden, indem Sie
git log v0.2..HEAD
für jedes Tag etc verwenden. Dies gibt Ihnen die Anzahl der Commits auf HEAD an, da der Pfad, der bei endet,v0.2
vom Pfad abweicht, dem HEAD folgt.Hier ist ein Python-Skript, das dies tut, indem es alle Tags durchläuft, die diese Prüfung ausführen, und dann das Tag mit den wenigsten Commits auf HEAD druckt, seit der Tag-Pfad divergiert:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
macht etwas etwas anderes, indem es von (z. B.) HEAD zurückverfolgt, um das erste Tag zu finden, das sich auf einem Pfad in der Geschichte von HEAD befindet. Sucht in git-Begriffengit describe
nach Tags, die über HEAD "erreichbar" sind. Es werden daher keine Tags gefundenv0.2
, die sich nicht auf dem Rückweg von HEAD befinden, sondern auf einem Pfad, der von dort abweicht.quelle
git describe --tags
Gibt das letzte Tag zurück, das vom aktuellen Zweig gesehen werden kann
quelle
WENN SIE MEHR ALS EINEN LETZTEN TAG BENÖTIGEN
(git beschreiben --tags gibt manchmal falsche Hashes, ich weiß nicht warum, aber für mich --max-count 2 funktioniert nicht)
Auf diese Weise können Sie eine Liste mit den neuesten 2 Tag-Namen in umgekehrter chronologischer Reihenfolge erhalten. Funktioniert perfekt mit Git 1.8.4. Für frühere Versionen von git (wie 1.7. *) Gibt es keine "tag:" - Zeichenfolge in der Ausgabe - löschen Sie einfach den letzten sed-Aufruf
Wenn Sie mehr als 2 neueste Tags möchten, ändern Sie dieses "sed 2q" in "sed 5q" oder was auch immer Sie benötigen
Dann können Sie einfach jeden Tag-Namen in eine Variable oder so analysieren.
quelle
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
wo in%D
den umliegenden schließt()
Zeichen, und diesed
s 5q Blätter 4 Zeilen vor 5 beginnen, dann druckt alle Zeichen zwischen ‚tag:` und dem ersten‘, '. Unter der Annahme, dass im Tag keine Kommas verwendet werden, funktioniert dies einwandfrei.Was ist mit allen Vorschlägen falsch (außer der Erklärung von Matthew Brett , aktuell in diesem Antwortbeitrag)?
Führen Sie einfach einen Befehl von anderen auf jQuery Git Geschichte geliefert , wenn Sie an anderer Stelle der Geschichte und Prüfergebnis mit visueller Tagging Geschichte Darstellung (I tat das ist , warum Sie diesen Beitrag sehen):
Heutzutage führen viele Projekte Releases (und damit Tagging) in einem von der Hauptlinie getrennten Zweig durch .
Dafür gibt es starke Gründe . Schauen Sie sich einfach alle etablierten JS / CSS-Projekte an. Für Benutzerkonventionen enthalten sie binäre / minimierte Release-Dateien in DVCS. Natürlich möchten Sie als Projektbetreuer Ihren Mainline- Diff- Verlauf nicht mit nutzlosen binären Blobs verschmutzen und das Festschreiben von Build-Artefakten außerhalb der Mainline durchführen .
Da Git DAG und keine lineare Historie verwendet, ist es schwierig, die Entfernungsmetrik zu definieren, sodass wir sagen können, dass die Drehzahl meiner am nächsten kommt
HEAD
!Ich beginne meine eigene Reise in (schau hinein, ich habe keine ausgefallenen Proof-Bilder in diesen langen Beitrag kopiert):
Was ist das nächste Tag in der Vergangenheit in Bezug auf die Verzweigung in Git?
Derzeit habe ich 4 vernünftige Definitionen des Abstands zwischen Tag und Revision mit abnehmender Nützlichkeit:
HEAD
, um die Basis mit dem Tag zusammenzuführenHEAD
und TagIch weiß nicht, wie ich die Länge des kürzesten Weges berechnen soll .
Skript, das Tags nach dem Datum der Zusammenführungsbasis zwischen
HEAD
und tag sortiert :Es ist für die meisten Projekte verwendbar.
Skript, das Tags nach der Anzahl der Umdrehungen sortiert , die über HEAD erreichbar, aber nicht über tag erreichbar sind:
Wenn Ihre Projekthistorie seltsame Daten für Commits hat (aufgrund von Rebases oder einer anderen Neufassung der Historie oder eines Trottels, vergessen Sie, die BIOS-Batterie oder andere Magie, die Sie für die Historie ausführen, zu ersetzen), verwenden Sie das obige Skript.
Für die letzte Option ( Datum des Tags unabhängig von der Zusammenführungsbasis ), um eine Liste der Tags nach Datum sortiert zu erhalten, verwenden Sie:
Um das aktuelle Überarbeitungsdatum bekannt zu machen, verwenden Sie:
Beachten Sie, dass
git describe --tags
die Verwendung in eigenen Fällen erfolgt, jedoch nicht zum Auffinden des vom Menschen erwarteten nächsten Tags in der Projekthistorie .HINWEIS Sie können die oben genannten Rezepte für jede Revision verwenden. Ersetzen
HEAD
Sie sie einfach durch das, was Sie möchten!quelle
git describe --abbrev=0 --tags
Wenn Sie das neueste Tag nicht sehen, stellen Sie sicher, dass Sie den Ursprung abrufen, bevor Sie Folgendes ausführen:
git remote update
quelle
Holen Sie sich das letzte Tag mit dem Präfix "ac" . Beispiel: Tag mit
ac1.0.0
oderac1.0.5
. Andere Tags genannt1.0.0
,1.1.0
werden ignoriert.Holen Sie sich das letzte Tag, dessen erstes Zeichen ist
0-9
. Daher werden diese Tags mit dem ersten Zeichena-z
ignoriert.Mehr Info
Aktualisieren
Mit
git tag --help
, über dassort
Argument. Es wirdlexicorgraphic order
standardmäßig verwendet, wenntag.sort
keine Eigenschaft vorhanden ist.Nach Google sagte jemand, dass Git 2.8.0 die folgende Syntax unterstützt.
quelle
quelle
Das Folgende funktioniert für mich, wenn Sie die letzten beiden Tags benötigen (zum Beispiel, um ein Änderungsprotokoll zwischen dem aktuellen Tag und dem vorherigen Tag zu erstellen). Ich habe es nur in Situationen getestet, in denen das neueste Tag das war
HEAD
.Es passt zu meinen Bedürfnissen, aber da ich kein Git-Assistent bin, bin ich sicher, dass es weiter verbessert werden könnte. Ich vermute auch, dass es brechen wird, falls sich der Commit-Verlauf vorwärts bewegt. Ich teile nur für den Fall, dass es jemandem hilft.
quelle
Mein erster Gedanke ist, dass Sie verwenden könnten
git rev-list HEAD
, der alle Umdrehungen in umgekehrter chronologischer Reihenfolge in Kombination mit auflistetgit tag --contains
. Wenn Sie eine Referenz finden, ingit tag --contains
der eine nicht leere Liste erstellt wird, haben Sie die neuesten Tags gefunden.quelle
Wenn Sie das letzte Tag suchen möchten, das auf einen bestimmten Zweig angewendet wurde, können Sie Folgendes versuchen:
quelle
Wenn Sie einen Einzeiler benötigen, der den neuesten Tag-Namen (nach Tag-Datum) für den aktuellen Zweig erhält :
Wir verwenden dies, um die Versionsnummer im Setup festzulegen.
Ausgabebeispiel:
Funktioniert auch unter Windows.
quelle
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) einfülle und das überspringe--points-at=HEAD
, funktioniert es. Mit diesem letzten Schalter wird nichts zurückgegeben, denke ich, weil meinHEAD
nicht markiert ist?HEAD
nicht markiert ist.Dies ist ein alter Thread, aber es scheint, dass vielen Menschen die einfachste, einfachste und korrekteste Antwort auf die Frage von OP fehlt: Um das neueste Tag für den aktuellen Zweig zu erhalten , verwenden Sie
git describe HEAD
. Erledigt.Bearbeiten: Sie können auch einen beliebigen gültigen Referenznamen angeben, auch Fernbedienungen. Das heißt,
git describe origin/master
Sie erfahren das neueste Tag, das vom Ursprung / Master aus erreichbar ist.quelle
for-each-ref
Befehl ( stackoverflow.com/a/5261470/515973 ) und die Kombination vonrev-list
unddescribe
( stackoverflow.com/a/7979255/515973 )git describe branchname --tags
funktioniert für mich, um das neueste Tag auf Zweig (Git-Version 2.12.2) zu bekommenUm das neueste Tag nur für den aktuellen Zweig- / Tag-Namen zu erhalten, dem der aktuelle Zweig vorangestellt ist, musste ich Folgendes ausführen
Und mein letztes Bedürfnis, das Tag +1 für das nächste Tag zu erhöhen und zu erhalten.
quelle
Für die gestellte Frage
Sie wollen
--first-parent
sagtgit log
, dass keine zusammengeführten Historien detailliert werden sollen , sondern--pretty=%d
dass nur die Dekorationen angezeigt werden sollen, dh lokale Namen für Commits.grep -m1
sagt "Nur eine Übereinstimmung", sodass Sie nur das neueste Tag erhalten.quelle
Wenn Ihre Tags sortierbar sind:
quelle
Nicht viel erwähnte nicht kommentierte Tags gegenüber kommentierten hier. 'beschreiben' funktioniert mit kommentierten Tags und ignoriert nicht kommentierte.
Dies ist hässlich, führt jedoch den angeforderten Job aus und findet keine Tags in anderen Zweigen (und nicht in dem im folgenden Beispiel im Befehl angegebenen Befehl: master).
Die Filterung sollte wahrscheinlich optimiert (konsolidiert) werden, aber auch dies scheint der Job zu sein.
Kritik willkommen, da ich dies jetzt nutzen werde :)
quelle
Eine andere einfache Möglichkeit, den neuesten Tag-Namen zu erhalten, ist mit
oder
um es in einer Variablen zu speichern.
git tag
listet alle verfügbaren Tags auf und gibt die allerletzte Zeile zurück, wenn das Ergebnis angezeigt wird.tail
-1
quelle