Еще совершает c64b9b8 (git 0.99, май 2005), время всегда упоминалось как
Дата в секундах с epoch '
commit 6eb8ae0 определяет дату как
unsigned long
с апреля 2005 года.TLDR;
]date до unix epoch может быть сохранен, но не может быть уверен, что он будет правильно представлен.
Попытка представить дату перед попыткой до: см. эта нить
Дата, которую я пытаюсь установить, - 4 октября 1958 года, которая находится вокруг timestamp -354808800.
Первая техника, используя флаги commit
--date
с ISO 8601: он говорит «invalid date
».Второй метод, описанный в архиве git ml , не использующий фарфор:
git commit git cat-file -p HEAD > tmp.txt # at this point, edit the file to replace the timestamp git hash-object -t commit -w tmp.txt #=> 2ee8fcc02658e23219143f5bcfe6f9a4615745f9 git update-ref -m 'commit: foo' refs/heads/master \ 2ee8fcc02658e23219143f5bcfe6f9a4615745f9
Дата фиксации эффективно обновляется, но
git show
фиксирует дату до нуля (Jan 1 1970
).tig(1)
отображает55 years ago
, поэтому фактическая дата фиксации должным образом сохранена.Последняя проблема: при попытке нажать эту фиксацию в удаленный репозиторий:
#=> remote: error: object 2ee8fcc02658e23219143f5bcfe6f9a4615745f9:invalid # author/committer line - bad date #=> remote: fatal: Error in object #=> error: unpack failed: index-pack abnormal exit
Наконец, при запуске
test-date
из источников git:./test-date show -354808800 #=> -354808800 -> in the future
Обсуждение в то время упомянуто:
Я не уверен, что на самом низком уровне нет какой-либо неспортивности. Мы свободно обмениваемся между time_t и unsigned long в низкоуровневом коде даты. Вероятно, это работает, потому что, как правило, выполняется работа с битами взад и вперед между подписанными и неподписанными типами, если вы в конечном итоге получаете тот тип, который вам нужен. Но это не обязательно переносимо, и могут быть тонкие ошибки. См., например, мои последние 9ba0f033 .
Хорошая новость, что это просто проблема с кодом. Формат данных прекрасен. Это просто запустило бы кого-то, проходящего через код и переключившего все «
unsigned long
» на «long long
» (илиtime_t
, или даже «gittime_t
», если мы хотим отвлечь его).и исправление алгоритма анализатора, по крайней мере, в
tm_to_time_t()
Это не просто «
sed s/unsigned long/long long
», а скорее проверка каждого изменения, чтобы убедиться, что вы не вводите новые ошибки, и что код правильно обрабатывает подписанные типы. Вот почему никто этого не сделал. ;)