एक भंडार के पहले क्लोन के दौरान, गिट पहले वस्तुओं को प्राप्त करता है (जो स्पष्ट रूप से पर्याप्त है), और फिर उसी समय के बारे में खर्च करता है "डेल्टास को हल करना"। क्लोन के इस चरण के दौरान वास्तव में क्या हो रहा है?
एक भंडार के पहले क्लोन के दौरान, गिट पहले वस्तुओं को प्राप्त करता है (जो स्पष्ट रूप से पर्याप्त है), और फिर उसी समय के बारे में खर्च करता है "डेल्टास को हल करना"। क्लोन के इस चरण के दौरान वास्तव में क्या हो रहा है?
जवाबों:
Git पैकफाइल्स में कुछ वस्तुओं को संग्रहीत करने के लिए डेल्टा एन्कोडिंग का उपयोग करता है । हालाँकि, आप वर्तमान संस्करण को प्राप्त करने के लिए किसी दिए गए फ़ाइल पर कभी भी हर एक परिवर्तन को वापस खेलना नहीं चाहते हैं , इसलिए Git में फ़ाइल सामग्री के सामयिक स्नैपशॉट भी संग्रहीत हैं। "हल करना डेल्टास" वह कदम है जो यह सुनिश्चित करता है कि सभी संगत बने रहें।
यहाँ प्रो Git पुस्तक के "Git Internals" खंड का एक अध्याय है, जो ऑनलाइन उपलब्ध है, जो इस बारे में बात करता है।
git gcया जब भी Git इसे आवश्यक रूप से निर्धारित करता है) Git सभी "ढीली" फाइलों को स्पेसफिकेशन को बचाने के लिए एक packfile में संपीड़ित करेगा और उस packfile में एक इंडेक्स फ़ाइल बनाई जाएगी। तो zlib अपने डेल्टा एल्गोरिथम के साथ संपीड़ित करेगा लेकिन Git डेल्टा-एन्कोडिंग का उपयोग पूर्व संस्करणों को संग्रहीत करने के लिए करता है। चूँकि सबसे आम और लगातार पहुँच नवीनतम संस्करण है, जो एक स्नैपशॉट के रूप में संग्रहीत है।
के चरण git cloneहैं:
"रिज़ॉल्यूशन डेल्टास" दूसरे चरण के लिए दिखाया गया संदेश है, जो पैक फ़ाइल ("गिट इंडेक्स-पैक") को अनुक्रमित करता है।
पैक फ़ाइलों करते नहीं उन में वास्तविक वस्तु आईडी, केवल वस्तु सामग्री है। तो यह निर्धारित करने के लिए कि ऑब्जेक्ट आईडी क्या हैं, git को ऑब्जेक्ट आईडी का उत्पादन करने के लिए पैक में प्रत्येक ऑब्जेक्ट का एक डिकम्प्रेस + SHA1 करना होता है, जिसे बाद में इंडेक्स फ़ाइल में लिखा जाता है।
एक पैक फ़ाइल में एक वस्तु को एक डेल्टा के रूप में संग्रहीत किया जा सकता है अर्थात किसी अन्य वस्तु को बनाने के लिए परिवर्तनों का एक क्रम। इस मामले में, git को आधार ऑब्जेक्ट को पुनः प्राप्त करने की आवश्यकता है, कमांड और SHA1 परिणाम लागू करें। डेल्टा कमांड के अनुक्रम को लागू करके आधार ऑब्जेक्ट को स्वयं प्राप्त किया जा सकता है। (हालांकि एक क्लोन के मामले में, बेस ऑब्जेक्ट पहले से ही सामना किया गया होगा, स्मृति में कितनी निर्मित वस्तुओं को कैश किया गया है, इसकी एक सीमा है)।
सारांश में, "हल करने वाले डेल्टा" चरण में पूरे रेपो डेटाबेस को डिकम्प्रेस करना और जांचना शामिल है, जो आश्चर्यजनक रूप से काफी लंबा समय नहीं लेता है। संभवतः decapressing और SHA1s की गणना वास्तव में डेल्टा कमांड को लागू करने से अधिक समय लेती है।
बाद में लाने की स्थिति में, प्राप्त पैक फ़ाइल में अन्य ऑब्जेक्ट्स के लिए संदर्भ (डेल्टा ऑब्जेक्ट बेस के रूप में) हो सकते हैं जो प्राप्त करने वाले गिट के पास पहले से ही होने की उम्मीद है। इस मामले में, प्राप्त करने वाला गिट वास्तव में किसी भी ऐसी संदर्भित वस्तुओं को शामिल करने के लिए प्राप्त पैक फ़ाइल को फिर से लिखता है, ताकि कोई भी संग्रहीत पैक फ़ाइल आत्मनिर्भर हो। यह वह जगह हो सकती है जहां संदेश "डेल्टास को हल करने" की उत्पत्ति हुई।
एम्बर ऑब्जेक्ट मॉडल का वर्णन करता प्रतीत होता है जो मर्क्यूरियल या समान उपयोग करता है। Git किसी ऑब्जेक्ट के बाद के संस्करणों के बीच डेल्टास को स्टोर नहीं करता है, बल्कि हर बार ऑब्जेक्ट का पूरा स्नैपशॉट लेता है। यह तब इन स्नैपशॉट को डेल्टा संपीड़न का उपयोग करके संपीड़ित करता है, उपयोग करने के लिए अच्छे डेल्टास को खोजने की कोशिश करता है, भले ही इतिहास में ये मौजूद हों।