Ich möchte git log
alle getaggten Commits im Hauptzweig (und keine der nicht getaggten Commits). Ist das möglich?
Wie funktioniert ein mit „Git Log“ markiertes Commits nur?
Der geheime Trick dabei besteht darin, das zu erkennen git log
verwendet die gleichen Regeln wie git rev-list
. Der letztere Befehl hat a --tags
Flag zum Ansehen von Tags. Also, wie bei den anderen Antworten bisher, wenn Sie bereit sind, sie sich anzusehen alle getaggte Commits, dieser einzelne Befehl wird es tun:
git log --no-walk --tags
(Der --no-walk
verhindert, dass dies mit Tags beginnt und alle ihre übergeordneten Commits, die Eltern der Eltern usw. findet.)
Aber Sie haben nach „getaggten Commits im Master-Zweig“ gefragt, was meiner Meinung nach (in technischer Hinsicht) „Commits bedeutet, auf die beide durch Tags verwiesen werden“. Und erreichbar über die master
Zweig”. Dies ist wesentlich schwieriger (git rev-list
kann Set Union über tun --stdin --no-walk
, scheint aber keine Möglichkeit zu haben, Schnittmengen festzulegen). Hier sind mehrere Methoden, um die richtigen Commit-IDs zu finden, mit verschiedenen Nachteilen:
-
Erstellen Sie zunächst zwei Dateilisten: „Alle getaggten Commits“ und „Alle Commits vom Master aus erreichbar“:
git rev-list --tags --no-walk > /tmp/all-tags git rev-list master > /tmp/all-master
Drucken Sie jetzt nur noch Zeilen aus, die nur in beiden Dateien vorkommen. Der
comm
Dienstprogramm kann dies tun. Es ist dokumentiert, dass die Dateien sortiert werden sollen, aber in allen Implementierungen, die ich gesehen habe, müssen sich die Dateien lediglich im befinden Dasselbe sozusagen in Ordnung bringen, das funktioniert also ohne Vorsortierung:comm -12 /tmp/all-tags /tmp/all-master
Nachteile: Benötigt zwei temporäre Dateien (es sei denn, Sie verwenden die spezielle
bash
Syntax, die verwendet/dev/fd
); funktioniert möglicherweise nicht ohne Sortierung; erfordertcomm
. -
Gleiche Idee wie zuvor, aber verwenden
uniq -d
um die Liste zu erstellen. Das wirklich tut erfordern eine Sortierung, Sie können die temporären Dateien jedoch mithilfe einer Pipe entfernen:(git rev-list --tags --no-walk; git rev-list master) | sort | uniq -d
Nachteil: Sortierung erforderlich. Die Commits kommen in einer seltsamen Reihenfolge heraus, nicht in der Reihenfolge, die Sie normalerweise sehen würden
git log
. -
Schreiben Sie Ihr eigenes Dienstprogramm, das im Grunde das tut, was das ist
comm
Methode würde genügen, ruft aber aufgit rev-list
selbst (vielleicht ein Skript, das temporäre Dateien erstellt mitmktemp
um eindeutige Namen zu erstellen).Nachteil: erfordert viel mehr Arbeit. 🙂
In allen Fällen müssen Sie, sobald Sie die Liste der Commit-IDs haben, diese nur noch weitergeben git log --no-walk
z.B:
git log --no-walk $(comm -12 /tmp/all-tags /tmp/all-master)
-
Gute Antwort! Ich habe es versucht
--tags
aber nicht in Verbindung mit--no-walk
. Der einfache Befehl bringt mich tatsächlich zu 95 % dorthin (obwohl ich die Gründlichkeit Ihrer Antwort schätze).– Davidkammern
5. Februar 2014 um 7:12 Uhr
Es gibt wahrscheinlich viele Möglichkeiten, dies zu erreichen, aber hier ist eine, von der ich denke, dass sie das tut, was Sie wollen:
git tag |
xargs -iCID git --no-pager log -1 CID
Eine Alternative, aber in die gleiche Richtung:
git tag | xargs git show --quiet
-
es mit verwenden
--oneline
Option ist das, wonach ich gesucht habe. Danke– Wesley Gonçalves
6. Januar 2021 um 18:24
GPHemsley
Seit 2014 ist in Git viel passiert; Moderne Benutzer können diesen Befehl für diesen Zweck nützlich finden:
git log --simplify-by-decoration --tags --pretty='tformat:%C(auto)%h %as%d %s'
Und wenn Sie andere Dekorationen (z. B. Zweige) hinzufügen möchten, entfernen Sie diese einfach --tags
:
git log --simplify-by-decoration --pretty='tformat:%C(auto)%h %as%d %s'
Alternativ könnte dies für Sie hilfreich sein:
git tag -l --format="%(tag) %(taggerdate:short) %(objectname:short) %(subject)"