जब यह कहता है कि यह वास्तव में क्या कर रहा है, तो यह "डेल्टास को हल करना" है।


187

एक भंडार के पहले क्लोन के दौरान, गिट पहले वस्तुओं को प्राप्त करता है (जो स्पष्ट रूप से पर्याप्त है), और फिर उसी समय के बारे में खर्च करता है "डेल्टास को हल करना"। क्लोन के इस चरण के दौरान वास्तव में क्या हो रहा है?



1
Git 2.20 (Q4 2018) और अधिक डेल्टा द्वीपों के लिए भी देखें: stackoverflow.com/a/52458712/6309
VONC

जवाबों:


54

Git पैकफाइल्स में कुछ वस्तुओं को संग्रहीत करने के लिए डेल्टा एन्कोडिंग का उपयोग करता है । हालाँकि, आप वर्तमान संस्करण को प्राप्त करने के लिए किसी दिए गए फ़ाइल पर कभी भी हर एक परिवर्तन को वापस खेलना नहीं चाहते हैं , इसलिए Git में फ़ाइल सामग्री के सामयिक स्नैपशॉट भी संग्रहीत हैं। "हल करना डेल्टास" वह कदम है जो यह सुनिश्चित करता है कि सभी संगत बने रहें।

यहाँ प्रो Git पुस्तक के "Git Internals" खंड का एक अध्याय है, जो ऑनलाइन उपलब्ध है, जो इस बारे में बात करता है।


80
यह उत्तर गलत है। यह वर्णन करता है कि मर्क्यूरियल कैसे काम करता है, न कि गिट। यह इस मुद्दे के लिए Google खोजों में आ रहा है इसलिए मुझे उत्तर देने की आवश्यकता महसूस हो रही है। गिट डेल्टा के रूप में कमिट के बीच के अंतर को संग्रहीत नहीं करता है; Git एक "संपूर्ण ऑब्जेक्ट" स्टोर है। जैसे, Git को किसी दिए गए फ़ाइल को दिखाने के लिए "स्नैपशॉट्स" की आवश्यकता नहीं है क्योंकि फ़ाइल इतिहास को डेल्टा से पुनर्निर्माण करने की आवश्यकता नहीं है। इस तरह से मर्क्यूरियल काम करता है।
सांठगांठ में 5

12
एकमात्र जगह जहां डेल्टा एन्कोडिंग खेल में आती है वह पैक फ़ाइल में है जो कड़ाई से संपीड़न और हस्तांतरण के लिए है - यह परिवर्तन नहीं करता है कि कैसे गिट "दुनिया" को देखता है। ( kernel.org/pub/software/scm/git/docs/v1.6.2.3/technical/… ) कृपया सटीक प्रतिक्रिया के लिए नीचे araqnid का उत्तर देखें।
सांठगांठ

4
इस संदर्भ में सभी "स्नैपशॉट" का अर्थ डेल्टा-एन्कोडेड संस्करण के बजाय फ़ाइल स्टेट की एक पूर्ण प्रति है। जैसा कि आपने बताया, गिट पैकफाइल्स में डेल्टा-एन्कोडिंग का उपयोग करता है । किसी ने भी यह नहीं कहा कि यह "कैसे दुनिया को देखता है" को बदल देता है; कृपया अपनी खुद की मान्यताओं को प्रोजेक्ट करना बंद करें।
अंबर

2
आपका उत्तर अभी भी गलत है। "Git में कभी-कभी फ़ाइल सामग्री के स्नैपशॉट भी संग्रहीत होते हैं।" -- वह सही नहीं है। "संकल्प को हल करना 'वह कदम है जो यह सुनिश्चित करता है कि सभी संगत रहें।" - यह भी सही नहीं है, नीचे araqnid की प्रतिक्रिया सही है।
सांठगांठ

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

118

के चरण git cloneहैं:

  1. रेपो डेटाबेस में सभी ऑब्जेक्ट की "पैक" फ़ाइल प्राप्त करें
  2. प्राप्त पैक के लिए एक इंडेक्स फाइल बनाएं
  3. सिर संशोधन की जाँच करें (एक गैर-नंगे रेपो के लिए, जाहिर है)

"रिज़ॉल्यूशन डेल्टास" दूसरे चरण के लिए दिखाया गया संदेश है, जो पैक फ़ाइल ("गिट इंडेक्स-पैक") को अनुक्रमित करता है।

पैक फ़ाइलों करते नहीं उन में वास्तविक वस्तु आईडी, केवल वस्तु सामग्री है। तो यह निर्धारित करने के लिए कि ऑब्जेक्ट आईडी क्या हैं, git को ऑब्जेक्ट आईडी का उत्पादन करने के लिए पैक में प्रत्येक ऑब्जेक्ट का एक डिकम्प्रेस + SHA1 करना होता है, जिसे बाद में इंडेक्स फ़ाइल में लिखा जाता है।

एक पैक फ़ाइल में एक वस्तु को एक डेल्टा के रूप में संग्रहीत किया जा सकता है अर्थात किसी अन्य वस्तु को बनाने के लिए परिवर्तनों का एक क्रम। इस मामले में, git को आधार ऑब्जेक्ट को पुनः प्राप्त करने की आवश्यकता है, कमांड और SHA1 परिणाम लागू करें। डेल्टा कमांड के अनुक्रम को लागू करके आधार ऑब्जेक्ट को स्वयं प्राप्त किया जा सकता है। (हालांकि एक क्लोन के मामले में, बेस ऑब्जेक्ट पहले से ही सामना किया गया होगा, स्मृति में कितनी निर्मित वस्तुओं को कैश किया गया है, इसकी एक सीमा है)।

सारांश में, "हल करने वाले डेल्टा" चरण में पूरे रेपो डेटाबेस को डिकम्प्रेस करना और जांचना शामिल है, जो आश्चर्यजनक रूप से काफी लंबा समय नहीं लेता है। संभवतः decapressing और SHA1s की गणना वास्तव में डेल्टा कमांड को लागू करने से अधिक समय लेती है।

बाद में लाने की स्थिति में, प्राप्त पैक फ़ाइल में अन्य ऑब्जेक्ट्स के लिए संदर्भ (डेल्टा ऑब्जेक्ट बेस के रूप में) हो सकते हैं जो प्राप्त करने वाले गिट के पास पहले से ही होने की उम्मीद है। इस मामले में, प्राप्त करने वाला गिट वास्तव में किसी भी ऐसी संदर्भित वस्तुओं को शामिल करने के लिए प्राप्त पैक फ़ाइल को फिर से लिखता है, ताकि कोई भी संग्रहीत पैक फ़ाइल आत्मनिर्भर हो। यह वह जगह हो सकती है जहां संदेश "डेल्टास को हल करने" की उत्पत्ति हुई।


7
क्या इसे समानांतर किया जा सकता है?
ब्रूक्सबैप

क्या यह डेल्टा संपीड़न एक zlib डेटा स्ट्रीम में कई वस्तुओं को संग्रहीत करने से अधिक है?
fuz

1
@FUZxxl हाँ, यह दो
बूँद की

@brooksbp: केवल सीमाओं के साथ। क्योंकि id 103fa49 के साथ ऑब्जेक्ट को डिकोड करने के लिए df85b51 की आवश्यकता हो सकती है, लेकिन जब आप 103fa49 प्राप्त करते हैं, तो df85b51 अभी तक नहीं है (पैक फ़ाइलों को sha1 हैश द्वारा सख्ती से ऑर्डर किया गया है)। इसलिए, हर चीज के लिए जो केवल सामान है जो पहले से ही वहां है, चीजें आसान हैं, लेकिन बाकी सब के लिए, आपको प्राप्त होने तक इंतजार करना होगा। और इस डेल्टा संपीड़न को नेस्ट किया जा सकता है, इसलिए 103fa49 को 4e9ba42 की आवश्यकता हो सकती है, जिसके लिए 29ad945 की आवश्यकता होती है, जो बदले में c9e645a की आवश्यकता होती है ... आपको चित्र मिलता है। [हाँ, मैंने देखा कि यह 4 साल का है;)]
बोडो थिसेन

2
@brooksbp: पता चला है, मैं गलत था, पैक फ़ाइल को sha1 हैश द्वारा क्रमबद्ध करने की आवश्यकता नहीं है। इसके अलावा, लिखते समय, git को जरूरत की वस्तुओं से पहले की जरूरत वाली वस्तुओं को लिखते हैं। तो, वास्तव में आपको इसे समानांतर करने में सक्षम होना चाहिए। केवल नुकसान जो रहता है: क्योंकि आप नहीं जानते कि आपको किन वस्तुओं की बाद में आवश्यकता होगी, आपको कुछ बार फिर से बनाना होगा। यहां देखें: kernel.org/pub/software/scm/git/docs/technical/…
Bodo Thiesen

4

एम्बर ऑब्जेक्ट मॉडल का वर्णन करता प्रतीत होता है जो मर्क्यूरियल या समान उपयोग करता है। Git किसी ऑब्जेक्ट के बाद के संस्करणों के बीच डेल्टास को स्टोर नहीं करता है, बल्कि हर बार ऑब्जेक्ट का पूरा स्नैपशॉट लेता है। यह तब इन स्नैपशॉट को डेल्टा संपीड़न का उपयोग करके संपीड़ित करता है, उपयोग करने के लिए अच्छे डेल्टास को खोजने की कोशिश करता है, भले ही इतिहास में ये मौजूद हों।


5
वास्तव में, जीआईटी के द्वारा ढीली वस्तुओं को स्टोर किया जा सकता है, जो जरूरी नहीं कि वे हमेशा इस तरह संग्रहीत हों - जैसे कि ढीली वस्तुओं को हटाया जा सकता है और पैक की गई सामग्री से बदला जा सकता है। मुझे नहीं लगता कि एम्बर के उत्तर ने बाद के संस्करणों के बारे में कहीं भी कुछ भी कहा।
अलब्लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.