Кто-нибудь знает, почему before
включает дату окончания?
Дата 2021-07-01 14:13
на самом деле позже 2021-07-01
Почему результаты неверны?
версия git 2.32.0
Кто-нибудь знает, почему before
включает дату окончания?
Дата 2021-07-01 14:13
на самом деле позже 2021-07-01
Почему результаты неверны?
версия git 2.32.0
Обратите внимание, что фильтры даты используют дату и время фиксации, а не дату и время автора.
Хотя это не задокументировано, как указано в ответе jthill и подтверждено моим ограниченным тестированием, неожиданно оказывается, что все фильтры даты, когда время не указано, относятся к текущему времени дня на вашем клиентском компьютере! Обратите внимание, что вы можете указать время, если хотите переопределить это:
git log --before=2021-07-02T23:59:59
(конец дня)
or
git log --before=2021-07-02T00:00:00
(начало дня)
Ниже мой тестовый скрипт. Он создает новое репо с одним пустым коммитом с датой фиксации от 2 дней назад минус 1 минута. (Так что через 1 минуту фиксация будет ровно 2 дня назад.) Затем скрипт зацикливается на минуту и каждые 10 секунд выводит текущее время, а также журнал с использованием параметров --before
и --after
. Сначала --before ничего не показывает, а --after показывает фиксацию, но через минуту логи переворачиваются, как только текущее время превосходит дату фиксации:
#!/bin/bash
# create a test repo
git init
echo ""
# create a date which is 2 days ago minus 1 minute
var1=$(date --date '-2879 min')
# create a date that is the first date in only YYYY-MM-DD format
var2=$(date -d "$var1" +%F)
# show the variables
echo "var1=$var1"
echo "var2=$var2"
echo ""
# create an empty commit with a committer date set to 2 days ago minus 1 minute
GIT_COMMITTER_DATE=$var1 git commit --allow-empty -m 'Create an empty commit'
# display the log; there should only be 1 commit
git log --pretty=fuller
echo ""
# Every 10 seconds for 70 seconds, display the log before 2 days ago without a time specified.
# As soon as the current time passes the time of the commiter_date on the commit, the log will show.
for (( x=1; x<=8; x++ ))
do
echo "Current time: $(date)"
echo "Output of: 'git log --before=$var2':"
git log --before=$var2
echo ""
echo "Output of: 'git log --after=$var2':"
git log --after=$var2
echo ""
sleep 10
done
2021-07-02
, чтобы быть концом дня, а не началом (я думаю, что это гораздо более распространенная интерпретация).
- person chepner; 02.07.2021
Если вы не укажете время отключения, будут использоваться текущие настенные часы, поэтому --before=yesterday
, заданный в 17:00, означает, что до 17:00 вчера. Если вы хотите указать полночь, добавьте T00:00
, --before=yesterday.T00:00
. У меня это достаточно удивительно, чтобы считаться полноценной бородавкой, как и поведение find
с размерами. К сожалению, это используется основными командами, так называемой сантехникой, и Git явно пообещал сценаристам, что их поведение и поэтому эта бородавка синтаксического анализа даты не изменится.
редактировать: попробуйте это:
unset head; for h in {0..23}; do
head=$( GIT_COMMITTER_DATE=`date -d yesterday\ T$h:00` \
git commit-tree ${head+-p $head} -m - @: )
done
git log -1 --pretty=fuller $head
git log -1 --pretty=fuller --before=yesterday $head
и вы увидите, что before=yesterday
выбирает тот, у которого отметка времени фиксации предшествует текущим настенным часам.
--before
и--until
являются синонимами, и имеет смысл включать--until
, я склоняюсь к плохо документированному, а не к глючному. (Можно также снисходительно возразить, что2021-07-21
— это сокращение от021-07-21 23:59:59
.) - person chepner   schedule 02.07.2021