Git / Mercurial रिपॉजिटरी कम जगह का उपयोग क्यों करते हैं?


15

मैंने कई चर्चाओं को यहां और एसओ पर पढ़ा है कि डीवीसीएस रिपॉजिटरी अपने केंद्रीकृत काउंटर-पुर्जों की तुलना में उसी या कम स्थान का उपयोग करते हैं। मैं इसे याद कर सकता हूं, लेकिन मुझे इसकी अच्छी व्याख्या नहीं मिली है कि ऐसा क्यों है। किसी को पता है?


5
क्या फॉलोइनफग पोस्ट्स को आप पढ़ रहे हैं? stackoverflow.com/questions/7727791/… या stackoverflow.com/questions/8657710/… या stackoverflow.com/questions/456336/…
VonC

1
मैं नहीं, धन्यवाद! तो मैं उन लोगों से समझता हूं कि दो उत्तर हैं: ज़ालिब का उपयोग करके संपीड़न और जब संभव हो तो वस्तुओं को पैकफाइल्स के रूप में सहेजना। मोज़िला से उदाहरण भी महान है!
एलेक्स फ्लोर्सु

1
@ एलेक्स नं, कि मुख्य कारण याद आती है। SVN पूर्ण स्नैपशॉट बचाता है, Git और Mercurial केवल HEAD संशोधन और भिन्नता को बचाता है। पारंपरिक संपीड़न का उपयोग करने से आपको लगभग 60-80% संपीड़न की सर्वोत्तम स्थिति मिल सकती है। डिफरेंसेस के इस्तेमाल से आप 99% तक दे सकते हैं। इन नंबरों को मेरी गांड से बाहर निकाला गया है - असली संख्या भिन्न हो सकती है; प्रवृत्ति ही हालांकि हो जाएगा।
कोनराड रुडोल्फ

@KonradRudolph, क्या packfiles के बारे में सब कुछ नहीं है?
एलेक्स फ्लोरस्क्यू

@ वास्तव में नहीं। जहां तक ​​मुझे पता है कि पैकफाइल इसके अलावा कई फाइलों को एक में पैक कर रहा है। यह जरूरी संबंधित नहीं है।
कोनराड रुडोल्फ

जवाबों:


18

मेरे अपने अनुभव से, निम्नलिखित कथन सभी सत्य हैं:

  • Git पाठ फ़ाइलों को संग्रहीत करने में बहुत कुशल है, और केवल इन फ़ाइलों को संग्रहीत करने के लिए जो परिवर्तित की गई थीं। इसलिए जब एसवीएन और गिट की तुलना रिपॉजिटरी आकार की तुलना करते हैं, तो वे समान हो सकते हैं, या गिट के लिए एक छोटा सा लाभ भी हो सकता है।
  • यह पूरी तरह से गलत है यदि आप रिपॉजिटरी के आकार की तुलना करते हैं जहां फाइलों की एक महत्वपूर्ण राशि कार्यालय फाइलें हैं (जैसे एमएस शब्द, एक्सेल, पावरपॉइंट, ...)। यहां Git पूरी प्रतियां भी संग्रहीत करता है, जिसका अर्थ है कि पावरपॉइंट स्लाइड स्टैक पर 10 छोटे परिवर्तन 10 पूर्ण प्रतियों में परिणाम होते हैं, जहां सबवर्सन केवल एक द्विआधारी अंतर को संग्रहीत करता है, जो 100 छोटे का एक कारक हो सकता है।

यदि आप चेकआउट स्थान की तुलना करते हैं (जो कि Git के साथ अपने आप में एक भंडार है), तो कहानी पूरी तरह से अलग है:

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

यदि आप बाइट्स की मात्रा की तुलना करते हैं, तो आपको नीचे या अपलोड करना होगा, यह फिर से अलग है।

  • तोड़फोड़ को आम तौर पर कम बाइट भेजना या प्राप्त करना होता है, क्योंकि यह केवल अंतर भेजता है। इसे हर कमिट और अपडेट पर करना होगा।
  • Git को संपूर्ण रिपॉजिटरी (प्रारंभ में) प्राप्त करना है, और फिर पूर्ण फ़ाइलें (संपीड़ित) भेजता है जो पाठ फ़ाइलों के लिए ऐसा भिन्न नहीं है, लेकिन बाइनरी फ़ाइलों के लिए भिन्न हो सकता है। और हां, Git केवल यही करता है कि जब आप दूरस्थ रिपॉजिटरी में किसी चीज को धक्का देते हैं या खींचते हैं।

तो अंत में, आप संतरे के साथ सेब की तुलना करते हैं, और आप जो तोड़फोड़ या गिट के साथ करना चाहते हैं, उसके आधार पर परिणाम भिन्न हो सकता है।


@jk ने पूर्ण प्रतियों या बाइनरी भिन्न के बारे में पूछा, और मैं उस प्रश्न का उत्तर नहीं दे सका। मैंने मैथ्यू मैक्कुलफ से पूछा जिसने हाल ही में जैक्स 2012 (जो मैंने दौरा किया था) में एक गिट कार्यशाला दी। उन्होंने गिट के आंतरिक कामकाज के बारे में विस्तार से बताने के लिए समय दिया है (उनके लिए बहुत बहुत धन्यवाद) । तो हाँ, वहाँ एक संपीड़न काम कर रहा है (और मैं एक microsoft ऑफिस फ़ाइल के साथ एक प्रयोग भी करूँगा और उसकी तुलना अपने gist से करूँगा), लेकिन नहीं, संपीड़न पूरी फ़ाइल पर किया जाता है। उनके लिंग का हवाला देते हुए:

ढीली वस्तुओं को संकुचित, लेकिन प्रत्येक प्रतिबद्ध के समय गैर-डेल्टा प्रारूप में लिखा जाता है।


1
क्या आप सुनिश्चित हैं कि git कार्यालय फ़ाइलों की पूर्ण प्रतियां संग्रहीत करता है? मुझे लगता है कि यह बाइनरी डिफरेंशियल स्टोर भी करता है। बेशक इस तरह की फाइलों के साथ वास्तव में समस्या यह है कि वे अक्सर पहले से ही संकुचित होते हैं इसलिए एक छोटा सा परिवर्तन पूरी फाइल को बदल सकता है
jk।

2
किसी से पूछा गया (ईमेल द्वारा) जो मुझसे अधिक जानता है, और मेरे उत्तर में उसका उत्तर शामिल करेगा।
12'12

6
Git पाठ और बाइनरी फ़ाइलों को बिल्कुल उसी तरह से व्यवहार करता है और भंडारण के संबंध में किसी भी संबंध में है। ढीली बनाम पैक की गई वस्तुएँ टेक्स्ट बनाम बाइनरी से संबंधित नहीं हैं। कारण बाइनरी फाइलें अक्सर पाठ फ़ाइलों की तुलना में बहुत अधिक भिन्न होती हैं, यह है कि कई द्विआधारी प्रारूप (सभी नए कार्यालय स्वरूपों सहित) पहले से ही संकुचित हैं और इस प्रकार सामग्री में एक छोटा सा परिवर्तन भी अक्सर परिणामी बाइनरी ब्लॉब में बड़े बदलाव का कारण बनता है। यह समान रूप से गिट और तोड़फोड़ के लिए चिंता का विषय है, लेकिन तोड़फोड़ केवल सर्वर पर जुर्माना लेता है, जबकि हर जगह गिट।
जान हुडेक

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

3
उन लोगों के लिए जो वास्तविक दुनिया की संख्या में रुचि रखते हैं: मैंने ठीक उसी रेपो से दो काम करने वाली प्रतियों की तुलना की। SVN वर्किंग कॉपी लगभग 2,9 GB है, GIT वर्किंग कॉपी लगभग 0,8 GB है।
जेन्सजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.