web-dev-qa-db-fra.com

git clone change l'heure de modification du fichier

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?

34
user3302761

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 ).

23
VonC

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 .

Mise à jour d'octobre 2019

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.

8
ERU

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'"'"'`;' 
6
Chris

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
0
Neal Fultz