Wie funktioniert ein mit „Git Log“ markiertes Commits nur?

Lesezeit: 3 Minuten

Ich möchte git log alle getaggten Commits im Hauptzweig (und keine der nicht getaggten Commits). Ist das möglich?

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:

  1. 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; erfordert comm.

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

  3. Schreiben Sie Ihr eigenes Dienstprogramm, das im Grunde das tut, was das ist comm Methode würde genügen, ruft aber auf git rev-list selbst (vielleicht ein Skript, das temporäre Dateien erstellt mit mktemp 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-walkz.B:

git log --no-walk $(comm -12 /tmp/all-tags /tmp/all-master)

  • Gute Antwort! Ich habe es versucht --tagsaber 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

GPHemsleys Benutzeravatar
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)"

1450410cookie-checkWie funktioniert ein mit „Git Log“ markiertes Commits nur?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy