Como o git log --since conta?

85

Eu tenho um repositório de teste simples com apenas vários commits e quero ver o log filtrado de data e hora:

$ git log --author = "automatix" --since = "2013-01-30" --pretty - test
comprometer ea0719bef142659fa561c9d040b2120012ed0184
Data: Qui, 31 de janeiro, 02:03:12 2013 +0100

commit ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: Qui, 31 de janeiro 01:59:11 2013 +0100

commit a0b027beba2cd03571bb9475b9db9542f8efe990
Data: Qui, 31 de janeiro 01:50:38 2013 +0100

commit add77c8fe2ba9254c11b98e14facede3420dc51c
Data: Qui, 31 de janeiro 01:48:34 2013 +0100

commit e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: Qui, 31 de janeiro 01:46:27 2013 +0100

commit 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: Qui, 31 de janeiro 01:41:27 2013 +0100

commit 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: Qui, 31 de janeiro 01:38:17 2013 +0100

commit a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: Qui, 31 de janeiro, 01:30:00 2013 +0100

O primeiro commit selecionado é a95527f36a533e1ecba1aadceea31a9dcbe1a8dbde 2013-01-30 01:30:00. 8 commits selecionados:

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

ESTÁ BEM. Agora eu seleciono desde 2013-01-31:

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

O que? Ok, isso deve significar que a sinceregra exclui os commits da data de início. Direito?

Mas vamos em frente:

$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --pretty - test
comprometer ea0719bef142659fa561c9d040b2120012ed0184
Data: Qui, 31 de janeiro, 02:03:12 2013 +0100

commit ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Data: Qui, 31 de janeiro 01:59:11 2013 +0100

commit a0b027beba2cd03571bb9475b9db9542f8efe990
Data: Qui, 31 de janeiro 01:50:38 2013 +0100

commit add77c8fe2ba9254c11b98e14facede3420dc51c
Data: Qui, 31 de janeiro 01:48:34 2013 +0100

commit e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Data: Qui, 31 de janeiro 01:46:27 2013 +0100

commit 8c286391e54d3fc1e210950b1320fd6f013a8f84
Data: Qui, 31 de janeiro 01:41:27 2013 +0100

commit 9c880595e57f717383796fa2940f41f0f42f7e2a
Data: Qui, 31 de janeiro 01:38:17 2013 +0100

commit a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Data: Qui, 31 de janeiro, 01:30:00 2013 +0100
$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --format = oneline - test | banheiro
      8 34 498

Agora, quando estou escrevendo o starttime também, os commits do starttime estão incluídos .

Eu não entendo a lógica. Alguém pode explicar porque funciona tão estranho?

obrigado

automatix
fonte
1
muito interessante mesmo .. faz sentido para mim se quando você fornece apenas uma data sem hora, o padrão é o último segundo do dia .. mas isso é apenas algo que estou tentando fazer. Obrigado por postar isso. Muito interessante!
ilan berci
1
Sim, parece que sem hora, o padrão é o último segundo do dia. Estranho, mas sem problema. Mas então o Git deve ser conseqüente e fazer o mesmo, quando o tempo sem segundos é fornecido. Portanto, o resultado de git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test deveria content 7 commits. Mas conteúdo 8. git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34 498
automatix
Discordo. Quando digo “… aconteceu depois de segunda-feira”, quero dizer “aconteceu depois do último segundo de segunda-feira” - “segunda-feira” significa um período de 24 horas. Enquanto quando digo “aconteceu depois das 9h”, quero dizer “aconteceu depois das 9h00” - “9h” é um ponto no tempo, não um intervalo de tempo. A interpretação de Git faz mais sentido.
Crônico de
2
É um bom ponto. Eu diria que essa lógica funciona apenas com "depois" - não com "desde". Mas no Git as palavras-chave "desde" anf "depois de" são sinônimos (acho que linguisticamente suja). git-scm.com/book/en/…
automatix

Respostas:

137

Caso ajude alguém que chega aqui como eu, depois de pesquisar um pouco descobri que usar o formato ISO8601 também funciona:

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

Isso lhe dará precisão até o segundo. Observação: você também pode usar:

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"

etc.

Claro, isso não "explica por que funciona tão estranho". No entanto, isso certamente resolveu o problema para mim.


EDITAR:

Depois de um pouco mais de pesquisa, descobri "por que funciona tão estranhamente":
Acontece que quando você não especifica um formato de data, o git log assume como padrão o fuso horário do autor ou as datas de confirmação , ou seja, para um comportamento consistente, é útil para declarar explicitamente seu formato de data com algo como:

git log --date=local

Por último, quando você não especifica um horário, o padrão é o horário local ao executar o comando.

Resumindo, ser específico deve resolver o problema:

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

Além disso, você pode definir o formato de data padrão permanentemente com o seguinte comando:

git config log.date local

você pode usar qualquer um destes valores: (relative|local|default|iso|rfc|short|raw)

gMale
fonte