Как считается git log --ince?

85

У меня есть простой тестовый репозиторий с несколькими коммитами, и я хочу увидеть журнал с фильтрами по дате и времени:

$ git log --author = "automatix" --since = "2013-01-30" --pretty - test
совершить ea0719bef142659fa561c9d040b2120012ed0184
Дата: 31 января, 02:03:12 2013 г. +0100

совершить ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Дата: 31 января, 01:59:11 2013 г. +0100

совершить a0b027beba2cd03571bb9475b9db9542f8efe990
Дата: 31 января, 01:50:38 2013 +0100

совершить add77c8fe2ba9254c11b98e14facede3420dc51c
Дата: 31 января, 01:48:34 2013 +0100

совершить e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Дата: 31 января, 01:46:27 2013 +0100

совершить 8c286391e54d3fc1e210950b1320fd6f013a8f84
Дата: 31 января, 01:41:27 2013 +0100

совершить 9c880595e57f717383796fa2940f41f0f42f7e2a
Дата: 31 января, 01:38:17 2013 г. +0100

совершить a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Дата: 31 января, 01:30:00 2013 +0100

Первая выбранная фиксация - a95527f36a533e1ecba1aadceea31a9dcbe1a8dbот 2013-01-30 01:30:00. Выбрано 8 коммитов:

$ git log --author = "automatix" --since = "2013-01-30" --format = oneline - test | Туалет
      8 34 498

ХОРОШО. Сейчас выбираю, поскольку 2013-01-31:

$ git log --author = "automatix" --since = "2013-01-31" --format = oneline - test | Туалет
      0 0 0

Какая? Хорошо, это должно означать, что sinceправило исключает коммиты startdate. Правильно?

Но продолжим:

$ git log --author = "automatix" --since = "31.01.2013 01:30:00" --pretty - test
совершить ea0719bef142659fa561c9d040b2120012ed0184
Дата: 31 января, 02:03:12 2013 г. +0100

совершить ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Дата: 31 января, 01:59:11 2013 г. +0100

совершить a0b027beba2cd03571bb9475b9db9542f8efe990
Дата: 31 января, 01:50:38 2013 +0100

совершить add77c8fe2ba9254c11b98e14facede3420dc51c
Дата: 31 января, 01:48:34 2013 +0100

совершить e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Дата: 31 января, 01:46:27 2013 +0100

совершить 8c286391e54d3fc1e210950b1320fd6f013a8f84
Дата: 31 января, 01:41:27 2013 +0100

совершить 9c880595e57f717383796fa2940f41f0f42f7e2a
Дата: 31 января, 01:38:17 2013 г. +0100

совершить a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Дата: 31 января, 01:30:00 2013 +0100
$ git log --author = "automatix" --since = "31.01.2013 01:30:00" --format = oneline - test | Туалет
      8 34 498

Теперь, когда я пишу StartTime , а также, коммиты по STARTTIME будут включены .

Я не понимаю логики. Кто-нибудь может объяснить, почему это так странно работает?

благодаря

Automatix
источник
1
действительно очень интересно .. для меня это имеет смысл, если, когда вы указываете только дату без времени, по умолчанию используется последняя секунда дня ... но это просто то, что я пытаюсь сделать. Спасибо, что разместили это. Очень интересно!
Илан Берчи
1
Да, кажется, что без времени по умолчанию используется последняя секунда дня. Штанге, но без проблем. Но тогда Git должен сделать то же самое, когда указано время без секунд. Итак, результат git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test должен быть 7 коммитов. Но это содержимое 8. git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34 498
automatix
Я не согласен. Когда я говорю «… произошло после понедельника», я имею в виду «произошло после последней секунды понедельника» - «понедельник» означает 24-часовой период времени. Когда я говорю «произошло после 9 часов», я имею в виду «произошло после 9: 00: 00.0000» - «9 часов» - это один момент времени, а не промежуток времени. Интерпретация Git имеет наибольший смысл.
Chronial
2
Это хороший момент. Я бы сказал, что эта логика работает только с «после», а не с «с». Но в Git ключевые слова "с" и "после" являются синонимами (я считаю это лингвистически грязным). git-scm.com/book/en/…
automatix

Ответы:

137

В случае, если это поможет кому-то еще, кто приземлится здесь, как я, после небольшого исследования я обнаружил, что использование формата ISO8601 также работает:

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

Это даст вам точность до секунды. Примечание: вы также можете использовать:

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"

и т.п.

Конечно, это не «объясняет, почему это так странно работает». Однако это определенно решило проблему для меня.


РЕДАКТИРОВАТЬ:

После небольшого дополнительного исследования я выяснил, «почему это работает так странно»:
оказывается, что когда вы не указываете формат даты, git log по умолчанию использует часовой пояс автора или даты фиксации , что означает согласованное поведение, это полезно чтобы явно объявить свой формат даты, например:

git log --date=local

Наконец, если вы не укажете время, по умолчанию будет установлено ваше местное время, когда вы запустили команду.

Короче говоря, конкретика должна решить проблему:

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

Кроме того, вы можете навсегда установить формат даты по умолчанию с помощью следующей команды:

git config log.date local

вы можете использовать любое из этих значений: (relative|local|default|iso|rfc|short|raw)

gMale
источник