wake-up-neo.com

Wie erhalte ich den neuesten Tag-Namen im aktuellen Zweig in Git?

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?

359
culebrón

Sie könnten einen Blick auf git describe werfen, der etwas von dem macht, was Sie fragen.

350
JB.

So erhalten Sie das aktuellste Tag:

git describe --tags

So erhalten Sie das neueste annotierte Tag:

git describe --abbrev=0 --tags
517
acassis

Gibt das Tag des zuletzt getaggten Commits über alle Zweige aus

git describe --tags $(git rev-list --tags --max-count=1)
249
kilianc

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.

35
William Pursell

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.

29

git describe --tags

gibt das letzte Tag zurück, das der aktuelle Zweig sehen kann

21
beenhere4hours

"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.

18
Matthew Brett
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.

13
east

Sie können Folgendes ausführen: git describe --tags $(git rev-list --tags --max-count=1) hier gesprochen: Wie erhalte ich den Tagnamen?

11
xserrat

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:

  • Länge des kürzesten Pfads von HEAD bis Zusammenführen der Basis mit dem Tag
  • Datum von Zusammenführungsbasis zwischen HEAD und Tag
  • Anzahl der Umdrehungen das von HEAD aus erreichbar ist, aber nicht vom Tag aus erreichbar ist
  • Datum des Tags unabhängig von Zusammenführungsbasis

Ich 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!

11
gavenkoa

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

9
Walter B
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.

Mehr Info

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 

Aktualisieren

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
9
AechoLiu

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.

5
Ivan Vučica

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.

3
Greg Hewgill

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")
2
Scyssion

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.

1
dohpaz42

wenn Ihre Tags sortierbar sind:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
0
Clintm

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.

0
jthill

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.

0
Shivan