Как вернуться назад во времени с датой Cygwin, возвращая даты со статическими секундами

Я использую git, пытаясь синхронизироваться с первыми коммитами каждого месяца за последний год. Я хочу иметь возможность возвращаться месяц за месяцем, в первый день месяца, ПЕРВАЯ ВТОРАЯ МЕСЯЦ. или, по крайней мере, из некоторого постоянного значения "секунд". Пока у меня есть это:

$(git rev-list --before "$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01" -n 01 HEAD)

Это, очевидно, не включает в себя постоянное значение секунд. В настоящее время запуск этого сценария, а затем повторный запуск его через час возвращает два разных значения sha1, поскольку он возвращается на x месяцев ОТ ТОЧНОГО ВРЕМЕНИ, в которое я запускаю сценарий. Я хочу, чтобы возвращаемые sha1 были одинаковыми, независимо от того, когда я запускаю этот скрипт. Имеет ли это смысл? Есть идеи?

1 ответ

Решение

Прежде всего, в вашей команде опечатка. Должно быть --before="$(...вам не хватает =,

Поведение date здесь не проблема date +%Y-%m-01 вернет что-то вроде 2011-10-01 как строка, нет никакой дополнительной информации о времени. Таким образом, второй вызов даты уменьшит его на $i количество месяцев, а также вернет жало формата, как 2011-09-01, Кроме этой строки никакая дополнительная информация не передается git-rev-list как значение аргумента --before=,

Есть некоторые вещи, которые вы должны рассмотреть, используя git-rev-list:

  1. Когда используешь HEAD Вы всегда ссылаетесь на текущую ветку. Поэтому, когда вы, например, извлекаете один из полученных идентификаторов фиксации, ваш HEAD изменится. Вы, возможно, хотите использовать master или любое другое название ветви вместо ссылки.
  2. У Git нет временного порядка коммитов. Вы можете сделать коммит, созданный 1 августа, иерархически после коммита, датированного 1 сентября. Это приведет к запутанным выводам при использовании --before или же --after аргументы, поскольку они полагаются на временную метку поля коммиттера.
  3. Временная метка поля коммиттера также может вводить в заблуждение. Когда ваша ветвь не имеет линейной истории, трудно сказать, была ли фиксация частью ветки в репозитории в определенный момент истории. Автор, возможно, сдвинул / слил свою ветку через X месяцев после выполнения коммита, поэтому он не был виден другим.

Учитывая все сказанное, у меня работает следующая команда:

$(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)

Это вернет идентификатор первого коммита после первого месяца. (Этот коммит не обязательно был сделан в течение этого месяца, возможно, в этом месяце коммитов не было).

Другие вопросы по тегам