2012-05-01 11 views
28

this के अनुसार:प्रतिबद्ध वस्तुओं में गिट स्टोर diff जानकारी करता है?

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

फिर भी जब मैं git show $SHA1ofCommitObject चलाने ...

commit 4405aa474fff8247607d0bf599e054173da84113 
Author: Joe Smoe <[email protected]> 
Date: Tue May 1 08:48:21 2012 -0500 

    First commit 

diff --git a/index.html b/index.html 
new file mode 100644 
index 0000000..de8b69b 
--- /dev/null 
+++ b/index.html 
@@ -0,0 +1 @@ 
+<h1>Hello World!</h1> 
diff --git a/interests/chess.html b/interests/chess.html 
new file mode 100644 
index 0000000..e5be7dd 
--- /dev/null 
+++ b/interests/chess.html 
@@ -0,0 +1 @@ 
+Did you see on Slashdot that King's Gambit accepted is solved! <a href="http://game 

... यह पिछले प्रतिबद्ध के साथ प्रतिबद्ध के diff आउटपुट। मुझे पता है कि गिट ब्लॉब ऑब्जेक्ट्स में diffs स्टोर नहीं करता है, लेकिन क्या यह प्रतिबद्ध वस्तुओं में diffs स्टोर करता है? या git show गतिशील रूप से diff की गणना कर रहा है?

+7

एक साइड नोट: गिट वास्तव में डेल्टा-संपीड़ित वस्तुएं करता है, लेकिन यह केवल संपीड़न के लिए है। लोग कभी-कभी गिट स्टोर्स को अलग करते हुए गलत समझते हैं। यहां प्रारूप के कुछ दस्तावेज हैं: http://book.git-scm.com/7_the_packfile.html (ध्यान रखें कि ऑब्जेक्ट्स जो इसके बीच डेल्टा रिकॉर्ड करते हैं, वे केवल डेटा के ब्लब्स हैं जो खोजे गए थे; वे जरूरी नहीं हैं एक ही फ़ाइल के लगातार संस्करण, हालांकि वे हो सकते हैं। और बेशक, डेल्टा लाइन-बाय-लाइन diffs नहीं हैं।) – Cascabel

+1

जेफोमी से बहुत प्रासंगिक लिंक अपडेट करना: http://git-scm.com/book/ एन/गिट-इंटरनल-पैकफाइल –

उत्तर

32

नहीं है, के लिए प्रतिबद्ध Git में वस्तुओं डिफ शामिल नहीं है - इसके बजाय, प्रत्येक प्रतिबद्ध वस्तु पेड़ है, जो रिकर्सिवली और पूरी तरह से स्रोत पेड़ है कि कम से प्रतिबद्ध की सामग्री को परिभाषित करता की एक हैश। ब्लॉब ऑब्जेक्ट्स, पेड़ ऑब्जेक्ट्स और ऑब्जेक्ट्स ऑब्जेक्ट्स में क्या होता है, इसकी nice explanation in the git community book है।

सभी डिफ कि Git के उपकरण द्वारा आपको दिखाई देते हैं फ़ाइलों की पूरी सामग्री से मांग पर गणना कर रहे हैं।

52

क्या बयान का मतलब है कि, अधिकांश अन्य संस्करण नियंत्रण प्रणाली अतीत में एक संदर्भ बिन्दु की जरूरत है फिर से बनाने वर्तमान प्रतिबद्ध करने के लिए सक्षम होने के लिए है।

x = snapshot 
+ = diff 
History: 
x-----+-----+-----+-----(+) Where we are now 

तो, ऐसे परिदृश्य में, फिर से बनाने के लिए:

उदाहरण के लिए, अतीत में कुछ बिंदु पर, एक अंतर के आधार पर VCS (संस्करण नियंत्रण प्रणाली) एक पूर्ण स्नैपशॉट संग्रहीत है | राज्य (अब) पर, इसे चेकआउट (एक्स) करना होगा और उसके बाद प्रत्येक (+) के लिए diffs लागू करें जब तक कि यह अब तक न हो जाए। ध्यान दें कि यह हमेशा के लिए डेल्टा स्टोर करने में बेहद अक्षम होगा, इसलिए हर बार, डेल्टा आधारित वीसीएसईएस एक पूर्ण स्नैपशॉट स्टोर करता है। Here's how its done for subversion

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

तो यदि यह मामला है, तो जहां डेल्टा संपीड़न कि Git में आते हैं का उपयोग करता है करता है?

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

हालांकि, जब गिट अपने कचरे के संग्रह को चलाता है (या जब आप git gc मैन्युअल रूप से कॉल करते हैं), तो डुप्लिकेट साफ़ हो जाते हैं और केवल पढ़ने वाली फ़ाइल फ़ाइल बनाई जाती है।आपको कचरा संग्रह मैन्युअल रूप से चलाने के बारे में चिंता करने की ज़रूरत नहीं है - गिट में हेरिस्टिक शामिल हैं जो यह कहता है कि ऐसा कब करना है।

+4

कुछ वोटों की आश्चर्यचकित। –

+0

धन्यवाद, कार्ल। तो एक विशाल परियोजना में मामूली परिवर्तन करने से भंडार को बहुत कम अनावश्यक प्रतियों (कम से कम लंबे समय तक) में नहीं बढ़ाया जाता है? – shuhalo

+0

@shuhalo यह सही है, हालांकि यह उससे भी बेहतर है। यदि आपने अपनी सभी स्रोत फ़ाइलों की प्रतिलिपि बनाई है और उन्हें अपने वर्तमान प्रतिबद्धता में जोड़ा है, तो जीसी रन के बाद केवल अतिरिक्त जानकारी मेटाडेटा - फ़ाइल नाम, पथ, लेखक और ऐसी होगी। फाइलों की वास्तविक सामग्री अतीत में ब्लॉब्स को संदर्भित करती है जो मूल कोड से आई थी। – Carl

संबंधित मुद्दे