Wie kann git dazu bringen, Commits in einem bestimmten Zeitraum für das Autorendatum anzuzeigen?

81

Anscheinend das :

git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"

Filtert Commits basierend auf dem Committer-Datum . Wie kann ich festlegen, dass Commits für einen bestimmten Autorendatumsbereich angezeigt werden?

Mr_and_Mrs_D
quelle
Mögliches Duplikat des Git-Protokolls: Filtern nach dem Autorendatum des Commits
underscore_d

Antworten:

39

Das kannst du nicht - zumindest nicht allein in Git. (Erinnerung an andere , diese Frage zu besuchen: Es geht nicht darum , sehen den Autor Datum, es geht um Commits durch die Auswahl des Autors Datum, a la --since/ --afterund --until/ --beforeverwenden Diese Selektoren das. Committer Datum, nicht der Autor Datum Betrachten wir als ein extremes Beispiel ein begehen. "jetzt" gemacht, so dass sein Committer-Datum in den 2000er Jahren liegt, aber im Feld "Autorendatum" auf einen Tag im Jahr 1999 zurückdatiert ist. Wenn Ihr Auswahlbereich "jederzeit nahe der Jahrhundertwende" ist, werden Sie de -Wählen Sie dieses Commit aus, da sein Committer-Datum "jetzt" ist, mehr als ein Jahrzehnt nach 1999.)

Ich halte dies für einen kleinen Fehler in Git: Sie sollten in der Lage sein, die Verwendung des Autorendatumsfelds überall dort anzufordern, wo Sie die Verwendung des Committer-Datumsfelds anfordern können. Dies ist leicht mit Protokoll Formatierung , da wir %adund %cdund dergleichen, aber nicht mit Auswahl begehen . Das nächste, das wir haben, ist das git rev-listSortieren nach Autorendatum (innerhalb der allgemeinen Toposortierung).

Ein globaler Schalter in git rev-list, wie --use-author-datewürde als einfacher Patch arbeiten, und würde nicht allzu schwer zu Git hinzuzufügen, aber ich denke , es wäre besser , zu haben --min-author-ageund --max-author-ageoder ähnlich, und ein „sortiert nach Autor Datum“ Flag (unabhängig von das allgemeine --topo-orderFlag, so dass das Setzen beider Flags den gleichen Effekt hat wie --author-date-order).

Um dieses Problem zu umgehen, können Sie alle potenziell interessanten Commits auflisten (mit git rev-listoder gleichwertig, z. B git log.: Verwenden Sie einen beliebigen Bezeichner, der Commits potenziell interessant macht, mit Ausnahme von Datumsfiltern: in diesem Fall ist dies nur der Fall --all) und extrahieren Sie alle Felder für das Autorendatum (mit git log --format=%atoder was auch immer), schneiden Sie dann die Liste der Festschreibungs-IDs selbst ab und senden Sie die verbleibenden Festschreibungs-IDs erneut an git log --no-walk. Aber das ist bestenfalls schmerzhaft. Weitere Informationen finden Sie in der Antwort von Tim Beigeleisen mit awk .

torek
quelle
Vielen Dank für Ihre Autorität, die die Verwirrung für mich beseitigt hat - das hat mich lange nervt und ich habe viel Zeit damit verbracht, die Manpages durchzugehen, um zu versuchen, den nicht vorhandenen Schalter zu finden. Gibt es dafür bereits einen Fehler?
Mr_and_Mrs_D
Ich weiß nicht, ob die Git-Leute dies für einen Fehler halten. Unter github.com/git/git finden Sie Links zu den Mailinglisten.
Torek
118

Vielleicht fehlt mir etwas, aber würde das nicht reichen?

git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"

Siehe auch hier

jackdbd
quelle
18
@ RossSolomon: Zeigt das Autorendatum an, wählt jedoch nach dem Datum des Committers aus. Nehmen wir als extremes Beispiel an, ich mache ein Commit mit einem Autorendatum von 1999 und einem Committerdatum von 01-01-2017. Die %adRichtlinie zeigt Ihnen dieses 1999 verfasste Commit, auch wenn dies weit vor 2016 liegt!
Torek
7
"Vielleicht fehlt mir etwas" Ja, der ganze Punkt der Frage. Dies verwendet genau die gleiche Filtermethode wie das OP, basierend auf dem Festschreibungsdatum, zeigt jedoch nur das Autorendatum an, nachdem bereits herausgefiltert wurde, was sie wollen. Wie hatten 18 Menschen ein so schlechtes Leseverständnis?
underscore_d
Dieser Befehl funktioniert nicht mit dem Datumsformat iso-8601 im --before und --after. Das Format, das für mich funktioniert, ist "dd-mm-ccyy".
Hktegner
8
Downvoting, da diese Antwort die Frage nicht beantwortet, obwohl sie im Allgemeinen nützlich ist.
Ravron
2
Selbst wenn es die Frage nicht beantwortet, wenn ich zufällig auf diese Antwort gestoßen bin und eine Lösung für mein ähnliches, aber nicht dasselbe Problem gefunden habe, stimme ich der Antwort einfach zu. Dies bedeutet jedoch nicht, dass die Antwort akzeptiert werden sollte, und ich verstehe, dass jemand sie ablehnt.
Mefitico
30

Du kannst .

Aber wie @torek bereits erwähnt hat, ist dies mit reinem Git möglicherweise nicht möglich. Eine Möglichkeit wäre, eine hübsche Formatausgabe von git login zu awkleiten und dort das Autorendatum zu überprüfen:

git log --date=iso --pretty=format:'%ad%x08%aN' | awk '$0 >= "2013-01-01" && $0 <= "2013-12-01"'

Hier %adgibt das Autorendatum im ISO-Format und %aNden Autorennamen an.

Tim Biegeleisen
quelle
1
Danke - Ich habe Toreks Antwort als umfassender akzeptiert, aber Ihre für die Angabe eines Ausgangspunkts
positiv bewertet
2

inspiriert von Tim Biegeleisens Antwort oben.

git log --all --date=iso --pretty=format:'%ad%x08%aN %s' | grep 2020-06-09 | sort -u

tat was ich brauchte. Ich möchte das Datum des Autors, nicht das Datum des Festschreibens, weil ich viel zurückdrücke und quetsche. Aber ich behalte wichtige Daten zu Import-Commits.

Im Zusammenhang damit habe ich einen kleinen Helfer, der es mir ermöglicht, die E-Mail des Autors zurückzusetzen, aber das Datum des ursprünglichen Autors beizubehalten. --reset-author überschreibt standardmäßig das Datum des Autors.

https://github.com/mathieujobin/git-scripts/blob/master/bin/git-reset-author-but-not-date

Im Git-Protokoll oben können Sie bei Bedarf hinzufügen %H, um die Githa zu erhalten

Mathieu J.
quelle
1
% x08 im hübschen Format bedeutet ASCII 08, dh die Rücktaste, also frisst es die letzte Ziffer der vorherigen% -Anzeige, die das Autorendatum im ISO-Format ist. git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u
Daher verwende