फ़ाइलों को कैसे स्टोर किया जाता है?


225

मैंने सिर्फ git सीखना शुरू किया और ऐसा करने के लिए मैंने Git कम्यूनिटी बुक पढ़ना शुरू किया , और इस पुस्तक में वे कहते हैं कि SVN और CVS फाइलों के बीच अंतर को स्टोर करते हैं और यह git सभी फाइलों का एक स्नैपशॉट स्टोर करता है।

लेकिन मैं वास्तव में स्नैपशॉट द्वारा उनका क्या मतलब नहीं है। क्या वास्तव में प्रत्येक कमिट में सभी फाइलों की एक प्रति बनाई जाती है क्योंकि मैंने उनके स्पष्टीकरण से यही समझा है।

पुनश्च: अगर किसी के पास सीखने के लिए कोई बेहतर स्रोत है तो मैं इसकी सराहना करूंगा।


20
यहाँ एक शानदार पोस्ट है जो विस्तार से बताती है कि कैसे काम करता है। आप जिस चीज की तलाश कर रहे हैं, वह संभवतः ऑब्जेक्ट डेटाबेस के बारे में है।
greg0ire

उत्कृष्ट लेख जिसमें अन्य महान संसाधनों के लिंक शामिल हैं। मैंने कुछ घंटों के लिए उनके साथ मज़े किए हैं।
मिहाई

2
मुझे यह वास्तव में अच्छा लेख मिला जो अंदर से बाहर गित
Sumudu

जवाबों:


275

Git में प्रत्येक फाइल के लिए एक पूर्ण प्रति शामिल है, सिवाय इसके कि, Git रेपो में पहले से मौजूद सामग्री के लिए, स्नैपशॉट बस डुप्लिकेट के बजाय उक्त सामग्री को इंगित करेगा।
इसका मतलब यह भी है कि एक ही सामग्री के साथ कई फाइलें केवल एक बार संग्रहीत की जाती हैं।

तो एक स्नैपशॉट मूल रूप से एक कमिट है, जो एक डायरेक्टरी स्ट्रक्चर के कंटेंट का जिक्र करता है

कुछ अच्छे संदर्भ हैं:

आप बताएं कि आप अपने प्रोजेक्ट के स्नैपशॉट को git कमिट कमांड के साथ सहेजना चाहते हैं और यह मूल रूप से आपके प्रोजेक्ट की सभी फाइलों को उस बिंदु की तरह प्रदर्शित करता है।

लैब 12 दिखाता है कि पिछले स्नैपशॉट कैसे प्राप्त करें


Progit पुस्तक एक स्नैपशॉट के अधिक व्यापक विवरण नहीं है:

Git और किसी भी अन्य VCS (तोड़फोड़ और दोस्तों में शामिल) के बीच प्रमुख अंतर यह है कि जिस तरह से Git अपने डेटा के बारे में सोचता है।
वैचारिक रूप से, अधिकांश अन्य सिस्टम फ़ाइल-आधारित परिवर्तनों की सूची के रूप में जानकारी संग्रहीत करते हैं। ये सिस्टम (CVS, सबवर्सन, पेरफोर्स, बाज़ार और इसी तरह) उन सूचनाओं के बारे में सोचते हैं जिन्हें वे फाइलों के एक सेट के रूप में रखते हैं और समय के साथ प्रत्येक फ़ाइल में किए गए बदलाव।

डेल्टा आधारित वीसीएस

Git इस तरह से अपने डेटा के बारे में सोचता या संग्रहीत नहीं करता है। इसके बजाय, Git अपने डेटा को एक मिनी फाइल सिस्टम के स्नैपशॉट के सेट की तरह अधिक समझता है।
हर बार जब आप Git में अपने प्रोजेक्ट की स्थिति को कमिट करते हैं, या सहेजते हैं, तो यह मूल रूप से उस समय आपकी सभी फ़ाइलों की तरह दिखने वाली तस्वीर लेता है और उस स्नैपशॉट का एक संदर्भ संग्रहीत करता है।
कुशल होने के लिए, यदि फाइलें नहीं बदली हैं, तो Git फाइल को फिर से स्टोर नहीं करता है - बस पिछले समान फ़ाइल के लिए एक लिंक जो पहले ही संग्रहीत है।
Git अपने डेटा के बारे में नीचे की तरह अधिक सोचता है:

स्नैपशॉट-आधारित वीसीएस

यह Git और लगभग सभी अन्य VCS के बीच एक महत्वपूर्ण अंतर है। यह Git पुनर्विचार को संस्करण नियंत्रण के लगभग हर पहलू को बनाता है जो कि पिछली पीढ़ी से कॉपी किए गए अधिकांश अन्य सिस्टम हैं। यह Git को मिनी फाइलसिस्टम की तरह बनाता है, जिसमें कुछ अविश्वसनीय रूप से शक्तिशाली उपकरण होते हैं, जो केवल VCS के बजाय इसके शीर्ष पर निर्मित होते हैं।


जान Hudec इस महत्वपूर्ण टिप्पणी कहते हैं :

हालांकि यह वैचारिक स्तर पर सही और महत्वपूर्ण है, लेकिन भंडारण स्तर पर यह सच नहीं है।
Git भंडारण के लिए डेल्टास का उपयोग करता है
इतना ही नहीं, बल्कि किसी भी अन्य प्रणाली की तुलना में यह अधिक कुशल है। क्योंकि यह प्रति-फ़ाइल इतिहास नहीं रखता है, जब वह डेल्टा संपीड़न करना चाहता है, यह प्रत्येक बूँद लेता है, कुछ बूँदें का चयन करता है जो समान होने की संभावना है (उत्तराधिकार का उपयोग करते हुए जिसमें पिछले संस्करण और कुछ अन्य लोगों के निकटतम सन्निकटन शामिल हैं), डेल्टास उत्पन्न करने की कोशिश करता है और सबसे छोटी को चुनता है। इस तरह यह (अक्सर, अनुमानों पर निर्भर करता है) अन्य समान फ़ाइलों या पुराने संस्करणों का लाभ उठा सकता है जो पिछले की तुलना में अधिक समान हैं। "पैक विंडो" पैरामीटर डेल्टा संपीड़न गुणवत्ता के लिए व्यापारिक प्रदर्शन की अनुमति देता है। डिफ़ॉल्ट (10) आम तौर पर सभ्य परिणाम देता है, लेकिन जब स्थान सीमित होता है या नेटवर्क स्थानान्तरण को गति देने के लिए, git gc --aggressiveमूल्य 250 का उपयोग करता है, जो इसे बहुत धीमी गति से चलाता है, लेकिन इतिहास डेटा के लिए अतिरिक्त संपीड़न प्रदान करता है।


4
@ जानहुडक अच्छा अंक। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी को शामिल किया है।
VonC

1
क्या किसी को Git की तरह स्टोरेज पैटर्न, उर्फ ​​हैश-आधारित मूल्य स्टोर के लिए कंप्यूटर विज्ञान शब्द पता है? (या कुछ इसी तरह)
जोनेस वर्मोरेल

34
ओपी के वास्तविक प्रश्न के संदर्भ में, पहला पैराग्राफ वास्तव में भ्रामक लगता है। यह जब तक आप हम चाहते हैं कि पता चलता है कि अंतिम अनुच्छेद को मिलता नहीं है, अरे हाँ, तथ्य यह है Git करता है "स्टोर [...] फ़ाइलों के बीच मतभेद। वास्तव में चाहते हैं कि जानकारी ऊपर चिह्नित किया गया था और नहीं इतनी गहरी दफन कर दिया। जैसा कि कहा गया है, कम से धन्यवाद कम से कम अपने उत्तर में वास्तविक कहानी सहित;)
जोश ओ'ब्रायन

1
@NickVolynkin बढ़िया! मुझे खुशी है कि उन उत्तरों को बड़े दर्शक मिल रहे हैं।
VonC

1
एक और अच्छी किताब: द गेट फ्रॉम द बॉटम अप: ftp.newartisans.com/pub/git.from.bottom.up.pdf
जोनास बर्लिन

46

Git तार्किक रूप से प्रत्येक फ़ाइल को उसके SHA1 के अंतर्गत संग्रहीत करता है। इसका मतलब यह है कि अगर आपके पास एक रिपॉजिटरी (या यदि आप एक फ़ाइल का नाम बदलें) में एक ही सामग्री के साथ दो फाइलें हैं, तो केवल एक प्रति संग्रहीत है।

लेकिन इसका मतलब यह भी है कि जब आप किसी फ़ाइल के एक छोटे से हिस्से को संशोधित करते हैं, तो फ़ाइल की दूसरी प्रतिलिपि संग्रहीत की जाती है। जिस तरह से git इसे हल करता है वह pack files का उपयोग करता है। एक बार में, एक रेपो से सभी "ढीली" फाइलें (वास्तव में, न केवल फाइलें, बल्कि प्रतिबद्ध और निर्देशिका जानकारी भी शामिल हैं) एक पैक फ़ाइल में इकट्ठा और संकुचित होती हैं। पैक फ़ाइल को zlib का उपयोग करके संपीड़ित किया जाता है। और इसी तरह की फाइलें डेल्टा-संपीड़ित भी हैं।

एक ही प्रारूप का उपयोग तब भी किया जाता है जब खींचने या धकेलने (कम से कम कुछ प्रोटोकॉल के साथ), इसलिए उन फ़ाइलों को फिर से पुन: डिज़ाइन करने की आवश्यकता नहीं होती है।

इसका परिणाम यह है कि एक git रिपॉजिटरी, जिसमें पूरी तरह से असम्पीडित वर्किंग कॉपी है, हाल ही की फाइलों को असम्पीडित किया गया है और कंप्रेस्ड पुरानी फाइल्स आमतौर पर अपेक्षाकृत छोटी हैं, जो वर्किंग कॉपी के आकार से दो गुना छोटी हैं। और इसका मतलब यह है कि यह एसवीएन रेपो की तुलना में छोटी है, भले ही एसवीएन इतिहास को स्थानीय रूप से संग्रहीत नहीं करता है।


1
आह इतना भावात्मक अधिक स्थान संयोग है
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.