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
Soll ich ein Skript schreiben, um die Datetime jedes Tags zu ermitteln und zu vergleichen?
Sie könnten einen Blick auf git describe
werfen, der etwas von dem macht, was Sie fragen.
So erhalten Sie das aktuellste Tag:
git describe --tags
So erhalten Sie das neueste annotierte Tag:
git describe --abbrev=0 --tags
Gibt das Tag des zuletzt getaggten Commits über alle Zweige aus
git describe --tags $(git rev-list --tags --max-count=1)
Um das aktuellste Tag zu erhalten, können Sie Folgendes tun:
$ git für-each-ref refs/tags --sort = -taggerdate --format = '% (refname)' --count = 1
Natürlich können Sie das Zählargument oder das Sortierfeld nach Wunsch ändern. Es scheint, als hätten Sie vielleicht eine etwas andere Frage gestellt, aber dies beantwortet die Frage so, wie ich sie interpretiere.
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 einem Tag versehen ist und das möglicherweise das ist, wonach Sie suchen oder nicht.
git describe --tags
gibt das letzte Tag zurück, das der aktuelle Zweig sehen kann
"Neueste" könnte in Bezug auf Git zwei Bedeutungen haben.
Sie könnten damit sagen, "welches Tag das Erstellungsdatum zum spätesten Zeitpunkt hat", und die meisten Antworten beziehen sich auf diese Frage. In Bezug auf Ihre Frage möchten Sie das Tag c
zurückgeben.
Oder Sie meinen damit "welcher Tag in der Entwicklungsgeschichte einem benannten Zweig am nächsten ist", normalerweise der Zweig, in dem Sie sich befinden, HEAD
. In Ihrer Frage würde dies das Tag a
zurückgeben.
Diese können natürlich anders sein:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
Stellen Sie sich vor, dass das Entwickler-Tag am Montag Z
als v0.2
und dann Q
am Dienstag als v0.1
markiert ist. v0.1
ist der neuere, aber v0.2
ist in der Entwicklungsgeschichte näher an HEAD, in dem Sinne, dass der Pfad, an dem er sich befindet, an einem Punkt beginnt, der näher an HEAD liegt.
Ich glaube, Sie möchten normalerweise diese zweite Antwort in der Entwicklungsgeschichte. Sie können dies herausfinden, indem Sie git log v0.2..HEAD
etc für jedes Tag verwenden. Dies gibt Ihnen die Anzahl der Commits auf HEAD, seit der Pfad, der auf v0.2
endet, vom Pfad abweicht, gefolgt von HEAD.
Hier ist ein Python-Skript, das dies durchläuft, indem es alle Tags durchläuft, die diese Prüfung ausführen, und dann das Tag mit den wenigsten Commits auf HEAD ausgeben, da der Tagpfad auseinander lief:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
verhält sich etwas anders, indem er von (z. B.) HEAD zurückverfolgt, um das erste Tag zu finden, das sich auf einem Pfad in der Historie von HEAD befindet. In git-Begriffen sucht git describe
nach Tags, die von HEAD "erreichbar" sind. Es werden daher keine Tags wie v0.2
gefunden, die sich nicht auf dem Pfad zurück von HEAD befinden, sondern auf einem Pfad, der von dort abweicht.
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
WENN SIE MEHR ALS EINEN LETZTEN TAG BENÖTIGEN
(git beschreiben --tags gibt manchmal falsche Hashes, ich weiß nicht warum, aber für mich funktioniert --max-count 2 nicht)
so erhalten Sie eine Liste mit den neuesten 2 Tag-Namen in umgekehrter chronologischer Reihenfolge. Sie funktioniert perfekt mit git 1.8.4. Bei früheren Versionen von git (wie z. B. 1.7. *) Gibt es keinen "tag:" - String in der Ausgabe - einfach den letzten sed-Aufruf löschen
Wenn Sie mehr als 2 letzte Tags wünschen, ändern Sie "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 parsen.
Sie können Folgendes ausführen: git describe --tags $(git rev-list --tags --max-count=1)
hier gesprochen: Wie erhalte ich den Tagnamen?
Was ist falsch mit allen Vorschlägen (außer Matthew Brett Erklärung, bis zum aktuellen Antwortpost)?
Führen Sie einfach einen Befehl aus, der von anderen in jQuery Git history bereitgestellt wird, wenn Sie sich am anderen Punkt von history befinden, und überprüfen Sie das Ergebnis mit visuelle Tagging-Historiendarstellung (I did, deshalb sehen Sie dieser Beitrag):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
Heutzutage führen viele Projekte Releases durch (und so ein Tagging) in einem separaten Zweig von der Hauptlinie.
Dafür gibt es starken Grund. Schauen Sie sich einfach alle gut etablierten JS/CSS-Projekte an. Für Benutzerkonventionen enthalten sie binäre/minimierte Freigabedateien in DVCS. Als Projektbetreuer möchten Sie natürlich nicht Ihre Hauptlinie diff mit unbrauchbaren binären Blobs spülen und die Ausführung von Build-Artefakten außerhalb der Hauptlinie durchführen.
Da Git DAG und keine lineare Historie verwendet, ist es schwer zu definieren Abstandsmetrik, so dass wir sagen können - oh, dass die Umdrehung meinem HEAD
am nächsten kommt!
Ich beginne meine eigene Reise (schau hinein, ich habe keine ausgefallenen Korrekturbilder in diesen langen Beitrag kopiert):
Was ist das nächstgelegene Tag in Bezug auf die Verzweigung in Git?
Momentan habe ich 4 sinnvolle Definitionen für die Entfernung zwischen Tag und Revision mit abnehmendem Nutzen:
HEAD
bis Zusammenführen der Basis mit dem TagHEAD
und TagIch weiß nicht, wie man Länge des kürzesten Pfads berechnet.
Skript, das Tags nach Datum von Zusammenführungsbasis zwischen HEAD
und Tag sortiert:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
Bei den meisten Projekten verwendbar.
Skript, das Tags nach Anzahl der Umdrehungensortiert, die von HEAD aus erreichbar sind, aber nicht vom Tag aus erreichbar sind:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
Wenn Ihr Projektverlauf merkwürdige Datumsangaben für Commits enthält (aufgrund von Rebases oder eines anderen Umschreibens der Geschichte oder eines Idioten, den BIOS-Akku oder andere magische Elemente, die Sie für den Verlauf verwenden, zu ersetzen), verwenden Sie das obige Skript.
Für die letzte Option (Datum des Tags unabhängig von Zusammenführungsbasis) können Sie eine Liste der Tags nach Datum sortieren.
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
Um das aktuelle Revisionsdatum zu erhalten, verwenden Sie:
$ git log --max-count=1
Beachten Sie, dass git describe --tags
für seine eigenen Fälle verwendet wird, jedoch nicht zum Auffinden von menschlich erwarteter nächstgelegener Tag im Projektverlauf.
NOTE Sie können die obigen Rezepte für jede Revision verwenden, ersetzen Sie einfach HEAD
durch das, was Sie möchten!
git describe --abbrev=0 --tags
Wenn Sie das neueste Tag nicht sehen, stellen Sie sicher, dass Sie Origin abrufen, bevor Sie Folgendes ausführen:
git remote update
git tag -l ac* | tail -n1
Holen Sie sich das letzte Tag mit dem Präfix "ac". Beispiel: Tag mit dem Namen ac1.0.0
oder ac1.0.5
. Andere Tags mit dem Namen 1.0.0
, 1.1.0
werden ignoriert.
git tag -l [0-9].* | tail -n1
Holen Sie sich das letzte Tag, dessen erstes Zeichen 0-9
ist. Daher werden diese Tags mit dem ersten Zeichen a-z
ignoriert.
git tag --help # Help for `git tag`
git tag -l <pattern>
Listet Tags mit Namen auf, die dem angegebenen Muster entsprechen (oder alle, wenn kein Muster angegeben ist). Wenn Sie "git tag" ohne Argumente ausführen, wird auch .__ angezeigt. alle Tags Das Muster ist ein Shell-Platzhalter (d. H. Mit Fnmatch (3) abgeglichen). Es können mehrere Muster gegeben werden. wenn einer von ihnen Übereinstimmungen wird das Tag angezeigt.
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
Mit git tag --help
über das Argument sort
. Es wird standardmäßig lexicorgraphic order
verwendet, wenn die tag.sort
-Eigenschaft nicht vorhanden ist.
Sortierreihenfolge Der Standardwert ist der für die Variable tag.sort konfigurierte Wert, wenn existiert oder sonst eine lexikographische Reihenfolge. Siehe git-config (1).
Nach google unterstütze sagte jemand git 2.8.0 folgende Syntax.
git tag --sort=committerdate
Das Folgende funktioniert für mich, wenn Sie die letzten beiden Tags benötigen (z. B. um ein Änderungsprotokoll zwischen dem aktuellen Tag und dem vorherigen Tag zu generieren). Ich habe es nur in Situationen getestet, in denen das neueste Tag die HEAD
war.
PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`
GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`
Es passt zu meinen Bedürfnissen, aber da ich kein Idiot bin, bin ich sicher, dass es noch verbessert werden könnte. Ich vermute auch, dass es brechen wird, falls sich die Commit-Historie weiterentwickelt. Ich teile nur, falls es jemandem hilft.
Mein erster Gedanke ist, Sie könnten git rev-list HEAD
verwenden, der alle Umdrehungen in umgekehrter chronologischer Reihenfolge in Kombination mit git tag --contains
aufführt. Wenn Sie eine Referenz finden, bei der git tag --contains
eine nicht leere Liste erzeugt, haben Sie die neuesten Tags gefunden.
Wenn Sie das letzte Tag suchen möchten, das in einem bestimmten Zweig angewendet wurde, können Sie Folgendes versuchen:
git describe --tag $(git rev-parse --verify refs/remotes/Origin/"branch_name")
Dies ist ein alter Thread, aber es scheint, dass viele Leute die einfachste, einfachste und richtigste Antwort auf die Frage von OP vermissen: Um den neuesten Tag für den aktuellen Zweig zu erhalten, verwenden Sie git describe HEAD
. Erledigt.
Bearbeiten: Sie können auch einen beliebigen gültigen Referenznamen oder sogar Fernbedienungen angeben. Das heißt, git describe Origin/master
informiert Sie über das letzte Tag, das von Origin/master aus erreichbar ist.
wenn Ihre Tags sortierbar sind:
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
Für die gestellte Frage,
So erhalten Sie den neuesten Tag-Namen im aktuellen Zweig
sie wollen
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
weist git log
an, keine zusammengeführten Historien im Detail anzugeben, --pretty=%d
sagt, dass nur die Verzierungen angezeigt werden, d. grep -m1
sagt "nur eine Übereinstimmung", so dass Sie nur den aktuellsten Tag erhalten.
Um das neueste Tag nur für den aktuellen Zweig/Tag-Namen zu erhalten, der dem aktuellen Zweig vorangestellt ist, musste ich Folgendes ausführen
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
Zweigmeister:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
Branch Gewohnheit:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
Und meine letzte Notwendigkeit, das Tag zu erhöhen und das Tag +1 für das nächste Tagging zu erhalten.
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
Wenn Sie einen Einzeiler benötigen, der das letzter Tag-Name (nach Tag-Datum) am aktueller Zweig erhält:
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
Wir verwenden dies, um die Versionsnummer im Setup festzulegen.
Ausgabebeispiel:
v1.0.0
Funktioniert auch unter Windows.