In che modo git log --since conta?


85

Ho un semplice repository di test con solo diversi commit e voglio vedere il registro filtrato di data e ora:

$ git log --author = "automatix" --since = "2013-01-30" --pretty - test
commit ea0719bef142659fa561c9d040b2120012ed0184
Data: giovedì 31 gennaio 02:03:12 2013 +0100

commit ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: giovedì 31 gennaio 01:59:11 2013 +0100

commit a0b027beba2cd03571bb9475b9db9542f8efe990
Data: giovedì 31 gennaio 01:50:38 2013 +0100

commit add77c8fe2ba9254c11b98e14facede3420dc51c
Data: giovedì 31 gennaio 01:48:34 2013 +0100

commit e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: giovedì 31 gennaio 01:46:27 2013 +0100

commit 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: giovedì 31 gennaio 01:41:27 2013 +0100

commit 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: giovedì 31 gennaio 01:38:17 2013 +0100

commit a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: giovedì 31 gennaio 01:30:00 2013 +0100

Il primo commit selezionato a95527f36a533e1ecba1aadceea31a9dcbe1a8dbproviene da 2013-01-30 01:30:00. Sono selezionati 8 commit:

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

OK. Ora seleziono da 2013-01-31:

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

Che cosa? Ok, questo dovrebbe significare che la sinceregola esclude i commit della data di inizio. Destra?

Ma andiamo avanti:

$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --pretty - test
commit ea0719bef142659fa561c9d040b2120012ed0184
Data: giovedì 31 gennaio 02:03:12 2013 +0100

commit ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: giovedì 31 gennaio 01:59:11 2013 +0100

commit a0b027beba2cd03571bb9475b9db9542f8efe990
Data: giovedì 31 gennaio 01:50:38 2013 +0100

commit add77c8fe2ba9254c11b98e14facede3420dc51c
Data: giovedì 31 gennaio 01:48:34 2013 +0100

commit e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: giovedì 31 gennaio 01:46:27 2013 +0100

commit 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: giovedì 31 gennaio 01:41:27 2013 +0100

commit 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: giovedì 31 gennaio 01:38:17 2013 +0100

commit a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: giovedì 31 gennaio 01:30:00 2013 +0100
$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --format = oneline - test | bagno
      8 34 498

Ora, quando scrivo anche l'ora di inizio, i commit dell'ora di inizio sono inclusi .

Non capisco la logica. Qualcuno può spiegare, perché funziona così strano?

Grazie


1
davvero molto interessante .. ha senso per me se quando fornisci solo un appuntamento senza orario, il valore predefinito è l'ultimo secondo della giornata .. ma questo è solo qualcosa a cui sto provando. Grazie per aver postato questo. Molto interessante!
ilan berci

1
Sì, sembra così, che senza un tempo si imposta l'ultimo secondo della giornata. Strano, ma nessun problema. Ma poi Git dovrebbe essere conseguente e fare lo stesso, quando viene fornito il tempo senza secondi. Quindi il risultato di git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test dovrebbe contenuto 7 si impegna. Ma contiene 8. git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34498
automatix

Non sono d'accordo. Quando dico "... è successo dopo lunedì", intendo "è accaduto dopo l'ultimo secondo di lunedì" - "lunedì" sta per un periodo di 24 ore. Mentre quando dico "è successo dopo le 9", intendo "è successo dopo le 9: 00: 00.0000" - "9 in punto" è un punto nel tempo, non un arco di tempo. L'interpretazione di Git ha più senso.
Cronologia

2
È un buon punto. Direi che questa logica funziona solo con "dopo" - non con "da". Ma in Git le parole chiave "da" anf "dopo" sono sinonimi (lo trovo linguisticamente sporco). git-scm.com/book/en/…
automatix

Risposte:


138

Nel caso in cui aiuti qualcun altro che atterra qui come ho fatto io, dopo un po 'di ricerche ho scoperto che anche l'uso del formato ISO8601 funziona:

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

Questo ti darà una precisione fino al secondo. Nota: puoi anche usare:

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"

eccetera.

Naturalmente, questo non "spiega perché funziona in modo così strano". Tuttavia, ha sicuramente risolto il problema per me.


MODIFICARE:

Dopo un po 'più di ricerca, ho scoperto "perché funziona in modo così strano":
risulta che quando non specifichi un formato di data, git log utilizza per impostazione predefinita il fuso orario dell'autore o le date di commit , il che significa che per un comportamento coerente, è utile per dichiarare esplicitamente il formato della data con qualcosa di simile:

git log --date=local

Infine, quando non specifichi un'ora, il valore predefinito è l'ora locale quando hai eseguito il comando.

Per farla breve, essere specifici dovrebbe risolvere il problema:

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

Inoltre, puoi impostare il formato della data predefinito in modo permanente con il seguente comando:

git config log.date local

puoi utilizzare uno qualsiasi di questi valori: (relative|local|default|iso|rfc|short|raw)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.