Jak git log --since się liczy?


85

Mam proste repozytorium testowe z kilkoma zatwierdzeniami i chcę zobaczyć dziennik filtrowany według daty i czasu:

$ git log --author = "automatix" --since = "2013-01-30" --pretty - test
zobowiązać ea0719bef142659fa561c9d040b2120012ed0184
Data: Czw 31 stycznia 02:03:12 2013 +0100

zatwierdzić ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: Czw 31 stycznia 01:59:11 2013 +0100

zatwierdzenie a0b027beba2cd03571bb9475b9db9542f8efe990
Data: Czw, 31 stycznia, 01:50:38 2013 +0100

zatwierdzić add77c8fe2ba9254c11b98e14facede3420dc51c
Data: Czw, 31 stycznia, 01:48:34 2013 +0100

zatwierdzić e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: czw. 31 stycznia 2013 r. 01:46:27 +0100

zatwierdzić 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: czw. 31 stycznia 2013 r. 01:41:27 +0100

zatwierdzić 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: Czw, 31 stycznia, 01:38:17 2013 +0100

zatwierdzić a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: Czw 31 Sty 01:30:00 2013 +0100

Pierwsze wybrane zatwierdzenie pochodzi a95527f36a533e1ecba1aadceea31a9dcbe1a8dbz 2013-01-30 01:30:00. Wybrano 8 zatwierdzeń:

$ git log --author = "automatix" --since = "2013-01-30" --format = oneline - test | toaleta
      8 34 498,

OK. Teraz wybieram od 2013-01-31:

$ git log --author = "automatix" --since = "2013-01-31" --format = oneline - test | toaleta
      0 0 0

Co? Ok, to powinno oznaczać, że sincereguła wyklucza commity z daty startowej. Dobrze?

Ale przejdźmy dalej:

$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --pretty - test
zobowiązać ea0719bef142659fa561c9d040b2120012ed0184
Data: Czw 31 stycznia 02:03:12 2013 +0100

zatwierdzić ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: Czw 31 stycznia 01:59:11 2013 +0100

zatwierdzenie a0b027beba2cd03571bb9475b9db9542f8efe990
Data: Czw, 31 stycznia, 01:50:38 2013 +0100

zatwierdzić add77c8fe2ba9254c11b98e14facede3420dc51c
Data: Czw, 31 stycznia, 01:48:34 2013 +0100

zatwierdzić e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: czw. 31 stycznia 2013 r. 01:46:27 +0100

zatwierdzić 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: czw. 31 stycznia 2013 r. 01:41:27 +0100

zatwierdzić 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: Czw, 31 stycznia, 01:38:17 2013 +0100

zatwierdzić a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: Czw 31 Sty 01:30:00 2013 +0100
$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --format = oneline - test | toaleta
      8 34 498,

Teraz, kiedy piszę StartTime jak dobrze, commity z startTime są włączone .

Nie rozumiem logiki. Czy ktoś może wyjaśnić, dlaczego to działa tak dziwnie?

Dzięki


1
rzeczywiście bardzo interesujące .. to ma dla mnie sens, jeśli podasz tylko datę bez godziny, domyślnie jest to ostatnia sekunda dnia .. ale to jest coś, czego się zastanawiam. Dzięki za opublikowanie tego. Bardzo interesujące!
ilan berci

1
Tak, wydaje się, że bez czasu domyślnie ustawia ostatnią sekundę dnia. Dziwne, ale nie ma problemu. Ale wtedy Git powinien być konsekwentny i robić to samo, gdy podany jest czas bez sekund. Więc wynik git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test powinien zawierać 7 zatwierdzeń. Ale zawiera 8 git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34 498
automatix

Nie zgadzam się. Kiedy mówię „… wydarzyło się po poniedziałku”, mam na myśli „wydarzyło się po ostatniej sekundzie poniedziałku” - „poniedziałek” oznacza okres 24 godzin. Kiedy mówię „wydarzyło się po godzinie 9”, mam na myśli „wydarzyło się po godzinie 9:00” - „godzina dziewiąta” to jeden punkt w czasie, a nie przedział czasu. Najbardziej sensowna jest interpretacja Gita.
Chronial

2
To dobra uwaga. Powiedziałbym, że ta logika działa tylko z „po”, a nie z „od”. Ale w Gicie słowa kluczowe „od„ anf ”po” są synonimami (uważam to za nieczyste językowo). git-scm.com/book/en/…
automatix

Odpowiedzi:


135

Na wypadek, gdyby pomogło to komuś, kto wyląduje tutaj tak jak ja, po krótkich badaniach odkryłem, że użycie formatu ISO8601 również działa:

git log --since="2014-02-12T16:36:00-07:00"

To da ci precyzję co do sekundy. Uwaga: możesz również użyć:

git log --after="2014-02-12T16:36:00-07:00"
git log --before="2014-02-12T16:36:00-07:00"
git log --since="1 month ago"
git log --since="2 weeks 3 days 2 hours 30 minutes 59 seconds ago"

itp.

Oczywiście to nie „wyjaśnia, dlaczego działa tak dziwnie”. Jednak z pewnością rozwiązało to problem za mnie.


EDYTOWAĆ:

Po dokładniejszym zbadaniu dowiedziałem się "dlaczego to działa tak dziwnie":
Okazuje się, że jeśli nie określisz formatu daty, dziennik git domyślnie ustawia strefę czasową autora lub daty zatwierdzenia , co oznacza spójne zachowanie, jest to przydatne jawnie zadeklarować format daty za pomocą czegoś takiego jak:

git log --date=local

Wreszcie, jeśli nie określisz czasu, po uruchomieniu polecenia zostanie ustawiony domyślny czas lokalny.

Krótko mówiąc, bycie konkretnym powinno rozwiązać problem:

git log --date=local --after="2014-02-12T16:36:00-07:00"

Możesz również ustawić domyślny format daty na stałe za pomocą następującego polecenia:

git config log.date local

możesz użyć jednej z następujących wartości: (relative|local|default|iso|rfc|short|raw)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.