GÜNCELLEME : Çözümüm artık Debian / Ubuntu / Mint, Fedora, Gentoo ve muhtemelen diğer dağıtımlarda paketlenmiştir:
https://github.com/MestreLion/git-tools#install
sudo apt install git-restore-mtime # Debian/Ubuntu/Mint
yum install git-tools # Fedora/ RHEL / CentOS
emerge dev-vcs/git-tools # Gentoo
IMHO, zaman damgalarını (ve izinler ve sahiplik gibi diğer meta verileri) depolamamak, büyük bir sınırlamadır git.
Linus'un zaman damgalarının, sırf "kafaları karıştırdığı make" için zararlı olduğuna dair mantığı yetersiz :
make clean herhangi bir sorunu düzeltmek için yeterlidir.
Yalnızca make, çoğunlukla C / C ++ kullanan projeler için geçerlidir . Python, Perl veya genel olarak dokümantasyon gibi komut dosyaları için tamamen tartışmalı.
Yalnızca zaman damgalarını uygularsanız zarar vardır . Depoda saklanmasının hiçbir sakıncası olmaz . Onları uygulamak basit olabilir --with-timestampsseçeneği git checkoutve arkadaşları ( clone, pullat vb), kullanıcının takdirine.
Hem Bazaar hem de Mercurial meta verileri depolar. Kullanıcılar ödünç verirken bunları uygulayabilir veya uygulamayabilir. Orijinal damgaları bile çünkü Ama GIT'de, mevcut repoda, böyle bir seçeneği yoktur.
Dolayısıyla, projelerin bir alt kümesine özgü çok küçük bir kazanç için (her şeyi yeniden derlemek zorunda kalmadan), gitgenel bir DVCS sakatlandıkça , dosyalar hakkında bazı bilgiler kaybolur ve Linus'un dediği gibi, yapılması INFEASIBLE şimdi. Üzücü .
Bununla birlikte, 2 yaklaşım önerebilir miyim?
1 - http://repo.or.cz/w/metastore.git , David Härdeman. git İlk etapta yapılması gerekeni yapmaya çalışır : Metadata'yı (sadece zaman damgalarını değil) işlenirken depoda depolar (ön taahhüt kancası aracılığıyla) ve çekerken (ayrıca kancalar aracılığıyla) yeniden uygular.
2 - Daha önce sürüm tarball'ları oluşturmak için kullandığım bir betiğin mütevazı versiyonu. Diğer yanıtlar belirtildiği gibi, yaklaşımdır biraz farklı her dosya için başvuruda: zaman damgası arasında En son taahhüt dosyası değiştirilmiş olabilir.
- birçok seçeneğe sahip git-restore-mtime , herhangi bir depo düzenini destekler ve Python 3 üzerinde çalışır.
Aşağıda, Python 2.7'de bir kavram kanıtı olarak betiğin gerçekten basit bir versiyonu bulunmaktadır. Gerçek kullanım için yukarıdaki tam sürümü şiddetle tavsiye ederim:
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)
os.utime(file, (mtime, mtime))
else:
mtime = long(line)
if not filelist:
break
Performans bile canavar projeleri için, oldukça etkileyici wine, githatta Linux çekirdeği:
bash
git
wine
linux kernel