Як рахує git log --since?


85

У мене є просте сховище тестів із кількома комітами, і я хочу переглянути журнал фільтрації дати та часу:

$ git log --author = "automatix" --since = "30.01.2013" --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 = "30.01.2013" --format = oneline - test | туалет
      8 34 498

В ПОРЯДКУ. Зараз я вибираю з 2013-01-31:

$ git log --author = "automatix" --since = "31.01.2013" --format = oneline - test | туалет
      0 0 0

Що? Гаразд, це повинно означати, що sinceправило виключає коміти дати початку. Правда?

Але давайте далі:

$ git log --author = "automatix" --since = "2013-01-31 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 = "2013-01-31 01:30:00" --format = oneline - тест | туалет
      8 34 498

Тепер, коли я також пишу час початку, коміти часу початку включаються .

Я не розумію логіки. Хтось може пояснити, чому це працює так дивно?

Дякую


1
справді дуже цікаво .. для мене є сенс, якщо, якщо ви вказали лише дату без часу, вона за замовчуванням буде останньою секундою дня .. але це якраз те, на що я вдарююсь. Дякуємо, що розмістили це. Дуже цікаво!
ilan berci

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 годин" - це один момент часу, а не проміжок часу. Інтерпретація Гіта має найбільш сенс.
Хроніал

2
Це хороший момент. Я б сказав, ця логіка працює лише з "після", а не з "оскільки". Але в Git ключові слова "оскільки" anf "після" є синонімами (я вважаю це мовно брудно). git-scm.com/book/en/…
automatix

Відповіді:


135

Якщо це допоможе комусь іншому, хто приземлиться тут, як я, після невеликих досліджень я виявив, що використання формату 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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.