git игнорирует $ GIT_AUTHOR_DATE - это ошибка? - PullRequest
6 голосов
/ 23 февраля 2011

РЕДАКТИРОВАТЬ : Сводка : Git не допускает даты до 1973/03/03 09:46:40 (эпоха + 100000000 с), заданные в «внутреннем формате даты» (секунды начиная с эпохи). Это должно разрешить "20110224" как краткую форму "2011-02-24". - Это не ошибка : Не совсем, но это также не задокументировано. - Обходной путь : не полагайтесь на внутреннюю дату git, если вы не можете. - Благодаря : хоббс

Привет всем,

У меня есть некоторые проблемы с git filter-branch, которые я отследил до git commit-tree. Рассмотрим этот сценарий:

#!/bin/bash
# please run these commands in an empty directory
# (should not destroy an existing repo, though. I think it would only
# a few dangling objects)

set -e -o pipefail

git init
tree=$(git write-tree)
commit=$(echo "my first commit -- the tree is empty" |
     env GIT_AUTHOR_DATE="0 +0000" git commit-tree $tree)

echo "This is commit $commit:"
git cat-file commit $commit

Обратите внимание, что env GIT_AUTHOR_DATE="0 +0000" устанавливает дату, используя "внутренний формат Git" - подробности см. На странице руководства git-commit-tree - 1970-01-01.

Но вывод этого скрипта (необработанный коммит) будет

tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
author Jane Doe <jane> 1298477214 +0100
committer Jane Doe <jane> 1298477214 +0100

my first commit -- the tree is empty

Теперь почему git игнорирует $ GIT_AUTHOR_DATE? Если это имеет значение, мой git --version дает git version 1.7.1.

1 Ответ

19 голосов
/ 23 февраля 2011

Найден в коде синтаксического анализатора дат git:

/*
 * Seconds since 1970? We trigger on that for any numbers with
 * more than 8 digits. This is because we don't want to rule out
 * numbers like 20070606 as a YYYYMMDD date.
 */
if (num >= 100000000 && nodate(tm)) {

Поскольку этот код явно отклоняет маленькие числа как возможные unix-даты, и строка не анализируется как любой другой формат даты, GIT_AUTHOR_DATEтрактуется как недействительный и полностью игнорируется (и, по-видимому, полностью).

Ваш метод должен работать нормально, если вы продолжаете синтезировать коммиты, имевшие место после 1973 года. В противном случае используйте один из других форматов даты :)

...