Frage

Was ist der einfachste Weg, um den jüngsten Tag in Git zu bekommen?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

Ausgabe:

a
b
c

Soll ich ein Skript schreiben, um jeden Tag des Datetime zu bekommen und sie vergleichen?

War es hilfreich?

Lösung

Sie einen Blick auf git describe nehmen könnte, was etwas in der Nähe tut, was Sie fragen.

Andere Tipps

Um den letzten Tag zu bekommen:

git describe --tags

Um die neueste kommentiert Tag:

git describe --abbrev=0

Will Ausgabe der Tag der letzten getaggten begehen in allen Zweigen

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

den jüngsten Tag zu erhalten, können Sie tun:

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

Natürlich können Sie das Argument count ändern oder das Sortierfeld nach Wunsch. Es erscheint dass Sie haben eine etwas andere Frage stellen bedeutet, aber dies die Frage nicht beantworten, wie ich es interpretieren.

Wie wäre das?

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

Technisch nicht unbedingt erhalten Ihnen den aktuellen Tag, aber die neuesten begehen, das markiert ist, das kann oder nicht die Sache sein kann, die Sie suchen.

git describe --tags

gibt den letzten Tag der Lage, durch Stromzweig gesehen werden

"Neue" zwei Bedeutungen in Bezug auf git haben könnte.

Sie könnte bedeuten, „dem Tag hat das Erstellungsdatum spätestens in der Zeit“, und die meisten Antworten sind für diese Frage. In Bezug auf Ihre Frage, würden Sie Tag c zurückzukehren.

Oder Sie könnte bedeuten, „welche Tag in der Nähe in der Entwicklungsgeschichte bis zu einem gewissen Namen Zweig ist“, in der Regel von der Filiale eingeschaltet sind, HEAD. In Ihrer Frage, würde dieser Tag a zurück.

Diese könnte natürlich anders sein:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

Stellen Sie sich den Entwickler tag'ed Z als v0.2 am Montag, und dann Q als v0.1 am Dienstag tag'ed. v0.1 ist die neuere, aber v0.2 ist näher in der Entwicklungsgeschichte HEAD, in dem Sinne, dass der Pfad auf beginnt an einem Punkt näher an den Kopf.

Ich glaube, Sie in der Regel diese zweite Antwort wollen, näher in der Entwicklungsgeschichte. Sie können, dass für jeden Tag unter Verwendung git log v0.2..HEAD usw. erfahren. Dies gibt Ihnen die Anzahl der Commits auf HEAD da der Weg bei v0.2 endet von dem Weg von HEAD gefolgt abwich.

Hier ist ein Python-Skript, das das tut durch Iterieren durch alle Tags, um diese Überprüfung ausgeführt wird, und dann mit dem wenigstenen Commits auf HEAD den Tag auszudrucken, da der Tag Weg abwich:

https://github.com/MacPython/terryfy/blob/master/git-closest -tag

git describe etwas tut, etwas anders, dass sie wieder aus (z) HEAD verfolgt den ersten Tag zu finden, die auf dem Weg zurück in die Geschichte von HEAD ist. In git Hinsicht sieht git describe für Tags, die „erreichbar“ von HEAD sind. Es wird daher keine Tags wie v0.2 finden, das nicht auf dem Weg von HEAD zurück, sondern ein Weg, der von dort abwich.

Sie können ausführen: git describe --tags $(git rev-list --tags --max-count=1) sprach hier: Anfahrt neuester Tag-Name?

git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

WENN SIE MEHR ALS EIN LAST andneedtag

(git beschreiben --tags gibt manchmal falsch Hashes, ich weiß nicht, warum, aber für mich --max-count 2 nicht funktioniert)

Dies ist, wie Sie die Liste mit den neuesten 2-Tag-Namen in umgekehrter chronologischer Reihenfolge bekommen, funktioniert perfekt auf Git 1.8.4. Für frühere Versionen von Git (. Wie 1,7 *), gibt es keinen "tag:" string in Ausgabe - gerade letzten sed Anruf löscht

Wenn Sie mehr als 2 neuesten Tags wollen - ändern, um dieses "sed 2q" auf "sed 5q" oder was auch immer Sie benötigen

Dann können Sie leicht jeden Tag-Namen zu Variable analysieren oder so.

Was ist falsch mit allen Vorschlägen (außer Matthew Brett Erklärung, auf dem neuesten Stand der diese Antwort post)?

Führen Sie einfach eine beliebige andere auf jQuery Git Geschichte geliefert Befehl, wenn Sie auf anderen Punkt der Geschichte und Prüfergebnis mit visuelle Tagging Geschichte Darstellung (I hat < strong /> das ist, warum Sie diesen Beitrag sehen):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

Todays viele Projektmitteilungen durchführen (und so Tagging) in separaten Zweig von den wichtigen .

Es gibt starken Grund für diese. Schauen Sie einfach auf alle etablierten JS / CSS-Projekte. Für Benutzer Konventionen sie tragen Binär / minimierte Release-Dateien in DVCS. Natürlich als Projektbetreuer Sie wollen nicht Müll Ihre Hauptstrecke diff Geschichte mit nutzlosen Binärblob und führt begehen von Build-Artefakte aus Hauptlinie .

Da Git verwendet DAG und nicht lineare Geschichte - es ist harte Distanzmetrik zu definieren , so können wir sagen - oh, dass rev ist am nächsten zu meinem HEAD

Ich beginne meine eigene Reise in (nach innen schauen, ich habe Lust Beweis Bilder zu diesen langen Pfosten nicht kopieren):

Was ist nächste Tag in der Vergangenheit in Bezug auf Git Verzweigung?

Zur Zeit hat ich 4 vernünftige Definition des Abstandes zwischen Tag und Revision mit der Nützlichkeit abnehmend:

  • Länge kürzesten Weg aus HEAD zu fusioniert Basis mit dem Tag
  • Datum von fusioniert Basis zwischen HEAD und Tag
  • Anzahl der Umdrehungen , dass von HEAD erreichbar, aber nicht erreichbar von Tag
  • Datum des Tages, unabhängig fusioniert Basis

Ich weiß nicht, wie berechnen Länge kürzesten Weges .

Skript, das Art-Tags nach Datum von fusionieren Basis zwischen HEAD und Tag:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

Es verwendbar für die meisten von Projekten.

Skript, das Art-Tags nach Anzahl der Umdrehungen , dass von HEAD erreichbar, aber nicht erreichbar von dem Tag:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

Wenn Ihr Projekt Geschichte haben seltsame Daten ein Commits (wegen Rebases oder eine andere Geschichte umzuschreiben oder einige Trottel vergessen BIOS-Batterie oder andere Zaubereien zu ersetzen, die Sie auf der Geschichte zu tun) verwenden obige Skript.

Für letzte Option ( Datum des Tages, unabhängig Basis fusionieren ) Stichwortliste Datum Verwendung sortierte zu bekommen:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

Um bekannte aktuelles Revisionsdatum Verwendung zu erhalten:

$ git log --max-count=1

Beachten Sie, dass git describe --tags Nutzung auf eigenen Fällen, aber nicht für Menschen erwartete am nächsten Tag in der Projektentwicklung zu finden .

Hinweis Sie oben Rezepte auf jeder Revision verwenden können, ersetzen Sie einfach HEAD mit dem, was Sie wollen!

git tag -l ac* | tail -n1

Holen Sie sich den letzten Tag mit dem Präfix "ac" . Zum Beispiel Tag mit ac1.0.0 genannt, oder ac1.0.5. Andere Tags genannt 1.0.0 wird 1.1.0 ignoriert werden.

git tag -l [0-9].* | tail -n1

Holen Sie sich den letzten Tag, deren ersten Zeichen ist 0-9. So werden diese Tags mit ersten char a-z ignoriert werden.

Mehr Infos

git tag --help # Help for `git tag`

git tag -l <pattern>
  

Liste Tags mit Namen, die dem angegebenen Muster (oder alle übereinstimmen, wenn kein              Muster gegeben ist). Running „git tag“ ohne Argumente auch Listen              Alle Tags. Das Muster ist ein Shell-Platzhalter (d.h. unter Verwendung angepasst              fnmatch (3)). Mehrere Muster gegeben werden kann; wenn einer von ihnen              Streichhölzer, wird der Tag angezeigt.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

Update

Mit git tag --help, über das sort Argument. Es wird lexicorgraphic order standardmäßig verwenden, wenn tag.sort Eigenschaft existiert nicht.

  

Sortierung              wenn es standardmäßig auf den Wert für die Variable konfiguriert tag.sort              existiert oder lexikographische Reihenfolge anders. Siehe git-config (1).

Nach google, jemand sagte git 2.8.0 Unterstützung folgende Syntax.

git tag --sort=committerdate

git describe --abbrev=0 --tags

Wenn Sie nicht über neuesten Tag sehen, stellen Sie sicher, Ursprung des Abrufens vor der Ausführung, dass:

git remote update

Die folgenden Werke für mich, falls Sie die letzten zwei Tags benötigen (zum Beispiel, um das Änderungsprotokoll zwischen dem aktuellen Tag und dem vorherigen Tag zu erzeugen). Ich habe es nur in Situation getestet, wo der letzte 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_"`

Sie paßt meine Bedürfnisse, aber da ich keinen git Assistent, ich bin sicher, dass es weiter verbessert werden könnte. Ich vermute, dass auch für den Fall, bricht es die commit Geschichte vorwärts bewegt. Ich bin nur für den Fall zu teilen, es hilft jemand.

Mein erster Gedanke ist, dass Sie git rev-list HEAD verwenden könnten, die alle die Drehzahl in umgekehrter chronologischer Reihenfolge aufgelistet, in Kombination mit git tag --contains. Wenn Sie einen ref finden, wo git tag --contains eine nicht leere Liste erzeugt, haben Sie den letzten Tag gefunden (s).

Wenn Sie den letzten Tag zu finden, die auf einem bestimmten Zweig angelegt wurde Sie folgende versuchen:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

Dies ist ein alter Thread, aber es scheint eine Menge Leute, die einfachste, fehlt einfachste und richtige Antwort auf OP Frage: Neuesten Tag für den Stromzweig bekommen, die Sie verwenden git describe HEAD. Fertig.

Edit: Sie können auch eine beliebige gültige refname liefern, auch Fernbedienungen; das heißt git describe origin/master werden Sie den aktuellen Tag, der von Herkunft / Master erreicht werden kann.

den neuesten Tag Um nur auf den aktuellen Zweig / Tag-Namen, die mit dem aktuellen Zweig Präfixe, ich hatte den folgend

auszuführen
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
  

Zweig Master:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448
  

Zweig custom:

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 zu erhöhen, und den Tag 1 für die nächste Markierung zu erhalten.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'

Für die Frage gefragt,

  

Wie Sie den neuesten Tag-Namen im aktuellen Zweig erhalten

Sie

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent sagt git log nicht zum Detail alle fusionierten Geschichten, --pretty=%d sagt nur die Dekorationen das heißt lokale Namen für alle Commits zu zeigen. grep -m1 sagt „nur ein Match“, so dass Sie nur den meist letzten Tag erhalten.

Wenn Sie Ihre Tags sind sortierbar:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top