Пакетный файл, чтобы сообщить имя файла первого файла в каталоге, в сообщении

Еще совершает 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», а скорее проверка каждого изменения, чтобы убедиться, что вы не вводите новые ошибки, и что код правильно обрабатывает подписанные типы. Вот почему никто этого не сделал. ;)

0
задан Gerhard Barnard 5 March 2019 в 08:56
поделиться