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'"'"'';'