Jak sprawić, by git pokazywał zatwierdzenia w określonym zakresie dat dla daty autora?

86

Najwyraźniej to :

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

filtry zatwierdza na podstawie daty zatwierdzającego . Jak mogę sprawić, by pokazywały zatwierdzenia dla określonego zakresu dat autora?

Mr_and_Mrs_D
źródło

Odpowiedzi:

41

Nie możesz - przynajmniej nie w samym Gicie. (Przypomnienie dla innych odwiedzających to pytanie: nie chodzi o oglądanie datę autor, to o wyborze zobowiązuje według daty autora, a la --since/ --afteri --until/ --beforete selektory wykorzystać w. Committer datę, a nie data autor Rozważmy jako przykład skrajnego commit. utworzono „teraz”, tak że jego data zatwierdzająca przypada na 2000 r., ale jest datowana wstecz w polu data autora na jakiś dzień w 1999 r. Jeśli zakres wyboru to „kiedykolwiek blisko przełomu wieków”, -wybierz to zatwierdzenie, ponieważ data jego autora to „teraz”, ponad dekadę po 1999 r.)

Uważam to za mały błąd w Git: powinieneś móc poprosić, aby używał pola daty autora wszędzie tam, gdzie możesz zażądać, aby używał pola daty autora. To jest łatwe formatowanie dziennika , ponieważ mamy %ada %cdi tym podobne, ale niemożliwe z popełnić wybór . Najbliższe, jakie mamy, git rev-listto sortowanie według daty autora (w ramach ogólnego sortowania według topografii).

Globalny przełącznik w git rev-list, jak --use-author-date, będzie działać jako zwykły plaster, a nie byłoby zbyt trudne, aby dodać do Git, ale myślę, że byłoby lepiej mieć --min-author-agei --max-author-agelub podobny, a „sortowanie według daty autor” flag (niezależnie od --topo-orderflagę ogólną , tak aby ustawienie obu flag miało taki sam efekt jak --author-date-order).

Aby obejść ten problem, możesz wymienić wszystkie potencjalnie interesujące zatwierdzenia (z git rev-listlub równoważnymi, na przykład git log: użyj dowolnego specyfikatora, który sprawia, że ​​zatwierdzenia są potencjalnie interesujące, z wyjątkiem filtrów dat: w tym przypadku to tylko --all) i wyodrębnij wszystkie ich pola daty autora (z git log --format=%atlub cokolwiek), a następnie sam wyczyść listę identyfikatorów zatwierdzeń, a następnie prześlij pozostałe identyfikatory zatwierdzeń do git log --no-walk. Ale to jest w najlepszym razie bolesne. Więcej informacji można znaleźć w odpowiedzi Tima Beigeleisena używającej awk .

torek
źródło
1
Dziękuję za twój autorytet, który wyjaśnił mi zamieszanie - denerwowało mnie to od dawna i spędziłem dużo czasu przeglądając strony podręcznika, próbując znaleźć nieistniejący przełącznik. Czy jest już otwarty dla tego błąd?
Mr_and_Mrs_D
Nie wiem, czy ludzie z Git uważają to za błąd. Zobacz github.com/git/git, aby uzyskać linki do list mailingowych.
torek
124

Może czegoś mi brakuje, ale czy to nie wystarczy?

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

Zobacz także tutaj

jackdbd
źródło
18
@ RossSolomon: to pokazuje datę autora, ale wybiera według daty autora . Aby wziąć skrajny przykład, załóżmy, że dokonuję zatwierdzenia z datą autora ustawioną na 1999 i datą osoby zatwierdzającej ustawioną na 01-01-2017. %adDyrektywa pokaże ten autorami-w-1999 popełnienia, mimo że jest drogi przed 2016!
torek
7
„Może czegoś mi brakuje” Tak, cały punkt pytania. Używa dokładnie tej samej metody filtrowania, co OP, na podstawie daty zatwierdzenia, ale po odfiltrowaniu tego, co chcą , pokazuje tylko datę autora. W jaki sposób 18 osób miało tak słabe rozumienie tekstu?
underscore_d
To polecenie nie działa z formatem daty iso-8601 w opcjach --before i --after. Format, który mi odpowiada, to „dd-mm-ccyy”.
hktegner
8
Głosowanie w dół, ponieważ ta odpowiedź nie odpowiada na pytanie, mimo że jest ogólnie użyteczna.
ravron
2
Nawet jeśli nie odpowiada na pytanie, jeśli przypadkiem natknąłem się na tę odpowiedź i znalazłem rozwiązanie mojego podobnego, ale nie-tego samego problemu, głosuję za odpowiedzią, taką prostą. Nie oznacza to jednak, że odpowiedź powinna zostać zaakceptowana i rozumiem, że ktoś ją odrzuca.
Mefitico
31

Ty może .

Ale jak wspomniał @torek, możesz nie być w stanie tego zrobić z czystym Gitem. Jedną z opcji byłoby przesłanie jakiegoś ładnego formatu wyjściowego z git logdo awki sprawdzenie tam daty autora:

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

Tutaj %adpodaje datę autora w formacie ISO i %aNpodaje nazwisko autora.

Tim Biegeleisen
źródło
1
Dzięki - poszedłem naprzód i zaakceptowałem odpowiedź Torka jako bardziej wyczerpującą, ale zagłosowałem za Twoją za podanie punktu wyjścia :)
Mr_and_Mrs_D
2

zainspirowany powyższą odpowiedzią Tima Biegeleisena.

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

zrobił to, czego potrzebowałem. Chcę mieć datę autora, a nie datę zatwierdzenia, ponieważ dużo zbieram i zgniatam. ale zachowuję ważne daty w zatwierdzeniach importu.

w związku z tym mam małego pomocnika, który pozwala mi zresetować adres e-mail autora, ale z zachowaniem oryginalnej daty autora. --reset-author domyślnie zastępuje datę autora.

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

w powyższym dzienniku git, w razie potrzeby, możesz dodać, %Haby uzyskać gitsha

Mathieu J.
źródło
1
% x08 w ładnym formacie oznacza ascii 08, czyli backspace, więc zjada ostatnią cyfrę poprzedniej reklamy%, która jest datą autora w formacie ISO, więc używam tej odmiany (również dodany dwukropek po nazwisku autora):git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u
sicko