Existe-t-il un moyen de connaître ou d’obtenir les horodatages originaux créés / modifiés? Merci.
Réponses
Trop de publicités?OUI, metastore ou git-cache-meta peuvent stocker de telles (méta-)données! Git par lui-même, sans outils de tiers, qui ne peut pas. Metastore ou git-cache-meta peut stocker n'importe quel fichier de métadonnées d'un fichier.
C'est par conception, comme metastore ou git-cache-meta sont destinés à cette fin, ainsi que de soutenir les utilitaires de sauvegarde et de synchronisation des outils.
(Désolé, juste un peu de plaisir de spin sur Jakub réponse)
Je crois que le seul à celles enregistrées dans la base de données de Git sont celles de l'auteur et de commettre des horodateurs. Je ne vois pas d'option pour Git pour modifier le fichier de l'horodatage pour correspondre à la plus récente s'engager, et il est logique que ce ne serait pas le comportement par défaut (parce que si c'était le cas, les Makefiles ne fonctionne pas correctement).
Vous pouvez écrire un script pour définir la date de modification de vos fichiers au moment de la plus récente s'engager. Il pourrait ressembler à quelque chose comme ceci:
for FILE in $(git ls-files)
do
TIME=$(git log --pretty=format:%cd -n 1 --date=iso $FILE)
TIME=$(date -j -f '%Y-%m-%d %H:%M:%S %z' "$TIME" +%Y%m%d%H%M.%S)
touch -m -t $TIME $FILE
done
NON , Git ne stocke tout simplement pas ces informations (méta) , sauf si vous utilisez des outils tiers tels que metastore ou git-cache-meta. Le seul horodatage enregistré est le correctif temporel (heure de l'auteur) et commit (heure du committeur) a été créé.
En effet, Git étant un système de contrôle de version, ce n'est pas un utilitaire de sauvegarde ou un outil de synchronisation.
Ce script python peut aider: pour chaque fichier s'applique le timestamp de la plus récente s'engager où le fichier a été modifié:
- Fonctionnalités de base, avec --help, les messages de débogage. Peut être exécuté n'importe où dans le travail de l'arbre
- À part entière de la bête, avec de nombreuses options. Prend en charge n'importe quel référentiel de mise en page.
Ci-dessous est un vraiment bare-bones version du script. Pour l'utilisation réelle, je vous suggère fortement un des plus robuste versions ci-dessus:
#!/usr/bin/env python
# Bare-bones version. Current dir must be top-level of work tree.
# Usage: git-restore-mtime-bare [pathspecs...]
# By default update all files
# Example: to only update only the README and files in ./doc:
# git-restore-mtime-bare README doc
import subprocess, shlex
import sys, os.path
filelist = set()
for path in (sys.argv[1:] or [os.path.curdir]):
if os.path.isfile(path) or os.path.islink(path):
filelist.add(os.path.relpath(path))
elif os.path.isdir(path):
for root, subdirs, files in os.walk(path):
if '.git' in subdirs:
subdirs.remove('.git')
for file in files:
filelist.add(os.path.relpath(os.path.join(root, file)))
mtime = 0
gitobj = subprocess.Popen(shlex.split('git whatchanged --pretty=%at'),
stdout=subprocess.PIPE)
for line in gitobj.stdout:
line = line.strip()
if not line: continue
if line.startswith(':'):
file = line.split('\t')[-1]
if file in filelist:
filelist.remove(file)
#print mtime, file
os.utime(file, (mtime, mtime))
else:
mtime = long(line)
# All files done?
if not filelist:
break
Toutes les versions analyser le log complet généré par un seul git whatchanged
de commande, des centaines de fois plus vite que d'élagage pour chaque fichier. Moins de 4 secondes pour git (24,000 s'engage, de 2 500 dossiers) et moins de 1 minute pour le noyau linux (40 000 fichiers, de 300 000 commits)