git-архив показывает одну и ту же дату фиксации в файлах с другой датой фиксации

В git у меня есть два файла с разной датой фиксации. Но когда я делаю git-archiveЯ получаю ту же дату коммита, почему?

[[ -e git_test ]] && rm -rf git_test
mkdir git_test
cd git_test
git init

# make file01
echo 'f01 $Format:%cd$' > file01.txt
echo 'file01.txt export-subst' >> .gitattributes
git add .gitattributes file01.txt
git commit -m "adding file01"
sleep 1
# make file02
echo 'f02 $Format:%cd$' > file02.txt
echo 'file02.txt export-subst' >> .gitattributes
git add .gitattributes file02.txt
git commit -m "adding file02"

# git archive
git archive HEAD | tar -x -C ..

echo
echo "git log date"
git log --format="%cd" file01.txt
git log --format="%cd" file02.txt

echo
echo "git archive date"
cd ..
cat *.txt

на выходе, с git-log дата принятия отличается (одна секунда), но файлы, созданные с git-archive иметь ту же дату фиксации

git log date
Fri Dec 27 15:17:22 2013 -0300
Fri Dec 27 15:17:23 2013 -0300

git archive date
f01 Fri Dec 27 15:17:23 2013 -0300
f02 Fri Dec 27 15:17:23 2013 -0300

2 ответа

Решение

Я решил использовать archive только поверх последних измененных файлов

 git archive HEAD $(git diff --name-only HEAD^) | tar -x -C

этот способ изменяет только дату фиксации (и файл) для последних измененных файлов.

Дата фиксации, используемая при подстановке ключевых слов во время git archive это коммит, который вы экспортируете, т.е. второй коммит в 15:17:23. Git не найдет самый последний коммит, который касается определенного файла, и не получит дату его фиксации. Вот что происходит, когда вы бежите, например, git log --format="%cd" file01.txt (ну, в нем будут перечислены даты коммитов всех коммитов, затрагивающих этот файл, но в этом случае есть только один коммит).

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