À mon humble avis, ne pas stocker les dates (et les autres métadonnées comme les autorisations et la propriété) est une grande limitation de l' git
.
Linus " justification de l'horodatage être nuisibles, juste parce qu'il "confond make
" est boiteux:
make clean
est suffisante pour résoudre tous les problèmes.
S'applique uniquement aux projets qui utilisent des make
, principalement en C/C++. Il est totalement discutable pour les scripts comme Python, Perl, ou de la documentation en général.
Il est seulement dommage si vous appliquez les horodateurs. Il n'y aurait pas de mal à ranger dans des pensions. Leur application pourrait être un simple --with-timestamps
option pour git checkout
et des amis (clone
, pull
etc), à l' utilisateur de discrétion.
Les deux Bazar et Mercurial stocke les métadonnées. Les utilisateurs peuvent appliquer ou non lors de la vérification. Mais dans git, puisque les horodateurs ne sont pas encore disponibles dans le dépôt, il n'y a pas une telle option.
Ainsi, pour un très faible gain (ne pas avoir à re-compiler tout) qui est spécifique à un sous-ensemble de projets, git
générale DVCS a été paralysé, quelques renseignements sur les fichiers sont perdus, et, comme Linus dit, il est IMPOSSIBLE de le faire maintenant. Triste.
Cela dit, je vous propose 2 approches?
1 - http://repo.or.cz/w/metastore.git par David Härdeman. Essaie de faire ce git
devrait faire en premier lieu: stocke les métadonnées (pas seulement les horodatages) dans le repo lors de la validation (via pre-commit hook), et ré-applique lors de l'extraction (également via les hooks).
2 - Mon humble version d'un script que j'ai utilisé avant pour générer des versions archivées. Comme mentionné dans d'autres réponses, l'approche est un peu différente: pour chaque fichier de l' horodatage 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
La Performance est assez impressionnant, même pour monster projets wine
, git
ou même le noyau linux:
bash
# 0.27 seconds
# 5,750 log lines processed
# 62 commits evaluated
# 1,155 updated files
git
# 3.71 seconds
# 96,702 log lines processed
# 24,217 commits evaluated
# 2,495 updated files
wine
# 13.53 seconds
# 443,979 log lines processed
# 91,703 commits evaluated
# 6,005 updated files
linux kernel
# 59.11 seconds
# 1,484,567 log lines processed
# 313,164 commits evaluated
# 40,902 updated files