अद्यतन : मेरा समाधान अब डेबियन / उबंटू / टकसाल, फेडोरा, जेंटो और संभवतः अन्य डिस्ट्रो में पैक किया गया है:
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, टाइमस्टैम्प (और अन्य मेटाडेटा जैसे अनुमतियां और स्वामित्व) को संग्रहीत नहीं करना एक बड़ी सीमा है git।
टाइमस्टैम्प्स के लिनेश का तर्क हानिकारक है क्योंकि यह "भ्रमित make" लंगड़ा है :
make clean किसी भी समस्या को ठीक करने के लिए पर्याप्त है।
केवल उन प्रोजेक्ट्स पर लागू होता है जो makeज्यादातर उपयोग करते हैं , ज्यादातर C / C ++। यह पूरी तरह से पायथन, पर्ल, या सामान्य रूप से प्रलेखन जैसी लिपियों के लिए मूट है।
टाइमस्टैम्प लगाने पर केवल नुकसान होता है। रेपो में उन्हें संग्रहीत करने में कोई नुकसान नहीं होगा । उन्हें लागू करने के लिए एक सरल हो सकता है --with-timestampsके लिए विकल्प git checkoutऔर दोस्तों ( clone, pullआदि), पर उपयोगकर्ता के विवेक।
बाज़ार और मर्क्यूरियल दोनों ही मेटाडेटा स्टोर करते हैं। जांच करते समय उपयोगकर्ता उन्हें लागू कर सकते हैं या नहीं। लेकिन गिट में, चूंकि मूल टाइमस्टैम्प रेपो में भी उपलब्ध नहीं हैं , इसलिए ऐसा कोई विकल्प नहीं है।
इसलिए, एक बहुत छोटे लाभ के लिए (सब कुछ फिर से संकलित करने के लिए नहीं) जो परियोजनाओं के सबसेट के लिए विशिष्ट है, gitजैसा कि एक सामान्य डीवीसीएस अपंग था , फाइलों के बारे में कुछ जानकारी खो जाती है , और, जैसा कि लिनुस ने कहा, यह करने के लिए महत्वपूर्ण है अब। दु: खी ।
उसने कहा, क्या मैं 2 दृष्टिकोण प्रस्तुत कर सकता हूं?
1 - http://repo.or.cz/w/metastore.git , डेविड हैदरमैन द्वारा। git पहली बार में जो करना चाहिए था वह करने की कोशिश करता है : आने पर (पूर्व-पूर्व हुक के माध्यम से ) रेपो में मेटाडेटा (न केवल टाइमस्टैम्प) को संग्रहीत करता है , और खींचने पर भी उन्हें फिर से लागू करता है (हुक के माध्यम से भी)।
2 - एक स्क्रिप्ट का मेरा विनम्र संस्करण जो मैंने रिलीज टारबॉल बनाने के लिए उपयोग किया था। के रूप में अन्य उत्तर में उल्लेख किया है, दृष्टिकोण है थोड़ा अलग प्रत्येक फ़ाइल के लिए लागू करने के लिए: टाइमस्टैम्प का सबसे हाल के लिए प्रतिबद्ध जहां फ़ाइल संशोधित किया गया था।
- गिट-रिस्टोर-माइम , बहुत सारे विकल्पों के साथ, किसी भी रिपॉजिटरी लेआउट का समर्थन करता है, और पायथन 3 पर चलता है।
नीचे एक है वास्तव में स्क्रिप्ट के नंगे हड्डियों संस्करण, एक-का-प्रमाण अवधारणा के रूप में, अजगर 2.7 पर। वास्तविक उपयोग के लिए मैं ऊपर दिए गए पूर्ण संस्करण की दृढ़ता से अनुशंसा करता हूं:
#!/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
प्रदर्शन बहुत प्रभावशाली है, यहां तक कि राक्षस परियोजनाओं के लिए wine, gitया यहां तक कि लिनक्स कर्नेल:
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