Git клон изменяет время изменения файла

Когда я клонирую репозиторий git, используя команду git clone ..., все клонированные файлы в моем локальном репозитории имеют одинаковое время модификации с датой и временем, когда была выпущена команда git clone.

Есть ли способ клонировать удаленный репозиторий git с фактическим временем изменения для каждого файла?

Ответы

Ответ 1

Git не записывает временную метку для файлов, так как это распределенная VCS (то есть время на вашем компьютере может отличаться от моего: нет "центральное" понятие времени и даты)

Официальный аргумент не записывать эти метаданные объясняется в этом ответе.

Но вы можете найти сценарии, которые попытаются восстановить значимую дату, как этот (или более простая версия та же идея).

Ответ 2

Вы можете получить дату последней модификации всех файлов в репозитории git. (время последнего изменения) https://serverfault.com/q/401437/267639

Затем с помощью команды touch измените дату изменения.

git ls-tree -r --name-only HEAD | while read filename; do 
  unixtime=$(git log -1 --format="%at" -- "${filename}")
  touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S')
  touch -t ${touchtime} "${filename}"
done

Также моя суть здесь.

Обновление за октябрь 2019 года

Благодаря P. Т. за ваш комментарий.
Я обновил ответ и суть, чтобы поддержать имена файлов с пробелом.

Ответ 3

Этот linux one-liner исправит все файлы (не папки - только файлы) - и также исправит файлы с пробелами в них: -

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | perl -ne 'chomp;next if(/'"'"'/);($d,$f)=(/(^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d(?: \+\d\d\d\d|)) (.*)/);print "d=$d f=$f\n"; 'touch -d "$d" '"'"'$f'"'"'';'