102 votes

Extraire l'ancien fichier AVEC les horodatages originaux créés / modifiés

Existe-t-il un moyen de connaître ou d’obtenir les horodatages originaux créés / modifiés? Merci.

63voto

B T Points 4868

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)

58voto

Dietrich Epp Points 72865

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

42voto

Jakub Narębski Points 87537

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.

17voto

MestreLion Points 1789

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é:

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X