Lorsque je clone un référentiel git en utilisant "git clone ...
"commande tous les fichiers clonés dans mon référentiel local ont la même heure de modification avec la date et l'heure lorsque git clone
une commande a été émise.
Existe-t-il un moyen de cloner le dépôt git distant avec l'heure de modification réelle pour chaque fichier?
Git n'enregistre pas l'horodatage des fichiers , car il s'agit d'un VCS distribué (ce qui signifie que l'heure sur votre ordinateur peut être différente du mien: il n'y a pas de notion "centrale" de l'heure et de la date)
L'argument officiel pour ne pas enregistrer ces métadonnées est expliqué dans cette réponse .
Mais vous pouvez trouver des scripts qui tenteront de restaurer une date significative, comme celle-ci (ou une version plus simple de la même idée ).
Vous pouvez récupérer la dernière date de modification de tous les fichiers dans un référentiel git. (temps de validation lat) https://serverfault.com/q/401437/267639
Utilisez ensuite la commande touch
pour changer la date de modification.
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
Aussi mon Gist ici .
Merci à P. T. pour votre commentaire.
J'ai mis à jour la réponse et Gist pour prendre en charge les noms de fichiers avec de l'espace.
Ce linux one-liner corrigera tous les fichiers (pas les dossiers - seulement les fichiers) - et il corrigera également les fichiers avec des espaces: -
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'"'"'`;'
Une variante plus courte de la réponse de @ Chris que je trouve plus facile à comprendre:
git ls-files | xargs -I{} git log -1 --date=format:%Y%m%d%H%M.%S --format='touch -t %ad "{}"' "{}" | $Shell