गिट सबमॉडल बनाम गिट क्लोन


18

मैं GitHub पर एक ओपन सोर्स प्रोजेक्ट पर काम कर रहा हूं।

इसमें एक उपनिर्देशिका / विक्रेता है, जिसमें कई बाहरी पुस्तकालयों की एक प्रति है। परियोजना के मूल अनुचर ने इस निर्देशिका को बाहरी पुस्तकालय की नई प्रतिलिपि के साथ एक बार में अपडेट किया।

एक डेवलपर ने मुझे इस प्रतिलिपि को गिट सबमॉड्यूल द्वारा बदलने के लिए विचार के साथ एक पुल अनुरोध भेजा ।

और मैं विचार कर रहा हूं कि यह अच्छा विचार है या नहीं।

गिट सबमॉडल पेशेवरों:

  • सबमॉड्यूल्स विशेष रूप से समान परिदृश्यों के लिए डिज़ाइन किए गए थे
  • यह विक्रेता के लिए आकस्मिक प्रतिबद्धता की संभावना को हटा देता है जिसे अगले अद्यतन के दौरान अधिलेखित कर दिया जाएगा

गिट सबमॉडल विपक्ष:

  • ऐसा लगता है कि गिट सबमॉड्यूल्स एक व्यक्ति को बनाए रखने से जटिलता को धक्का देता है जो परियोजना को क्लोन / खींच देगा (परियोजना के साथ काम करना शुरू करने के लिए क्लोन करने के बाद आवश्यक अतिरिक्त कदम: "गिट सबमॉडल इनिट", "गॉट सबमॉड्यूल अपडेट"

इस पर आपकी क्या राय है?

एक और चीज़। यह समस्या बहुत छोटे आकार की लाइब्रेरी है जिसमें बहुत सीमित बाहरी निर्भरताएँ हैं। मुझे लगता है कि किसी भी निर्माण उपकरण अब इसके लिए overkill होगा।


4
वैकल्पिक रूप से वे कर सकते हैं git clone --recursiveऔर फिर सबमॉड्यूल कमांड करने की जरूरत नहीं है। किसी और ने इस tidbit का उल्लेख नहीं किया था; ज्यादातर लोग मुझे पता है कि README में सबमॉड्यूल के विज्ञापन हैं।
लेवी मॉरिसन

जवाबों:


9

एक सबमॉड्यूल का एक विकल्प उपयोग करना है git subtree। यह git submoduleअंतिम उपयोगकर्ता के लिए जटिलता को आगे बढ़ाए बिना लाभ देता है । तीसरे पक्ष के भंडार को मुख्य परियोजना के पेड़ में मिला दिया जाता है, लेकिन मेटाडेटा को इस तरह से संग्रहीत किया जाता है कि आप कर सकते हैं:

  • तीसरे पक्ष के भंडार को बाद में निकालें, यदि कोई दिलचस्प बदलाव किया गया है
  • थर्ड पार्टी रिपॉजिटरी से नए अपडेट में मर्ज (नोट मर्ज , ओवरराइट नहीं)

उन उपयोगकर्ताओं के लिए, जो सबमोडुल्स को समझने के लिए पर्याप्त परिष्कृत नहीं हैं, उपप्रकार का दृष्टिकोण आपके प्रोजेक्ट के क्लोन को किसी अन्य क्लोन से अधिक कठिन नहीं बनाता है। प्रलेखन से एक छोटा धुंधला:

उपप्रोजेक्ट उपप्रोजेक्ट को मुख्य परियोजना के एक उपनिर्देशिका के भीतर शामिल करने की अनुमति देते हैं, वैकल्पिक रूप से उपप्रोजेक्ट के पूरे इतिहास सहित।

उदाहरण के लिए, आप अपने एप्लिकेशन के उपनिर्देशिका के रूप में लाइब्रेरी के लिए स्रोत कोड शामिल कर सकते हैं।

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

मैंने सबमॉड्यूल्स का उपयोग करके काम पर एक परियोजना स्थापित की थी, और सबमॉडल्स को हर किसी के क्लोन में अद्यतित रखने के साथ परेशानी बहुत ज्यादा काम की थी। मैं हाल ही में हर जगह उपशीर्षक का उपयोग करने के लिए बदल गया और उन समस्याओं को गायब हो गया।

ध्यान दें कि git-subtree git/contribनिर्देशिका का हिस्सा है , और इसे अलग से स्थापित किया जाना चाहिए।


4

सबमॉड्यूल्स का उपयोग करने का एक दोष यह है कि जीथब (और कई अन्य सेवाओं) पर टारबॉल या जिप-आर्काइव सबमॉड्यूल्स के स्रोतों को शामिल नहीं करते हैं। अर्थात्, अभिलेख आत्म-निहित नहीं हैं। यह एक समस्या है यदि रिपॉजिटरी छोटी है और वास्तव में एक बिल्ड स्क्रिप्ट नहीं है, जैसे जावास्क्रिप्ट लाइब्रेरी पर निर्भर स्थिर HTML साइट।


3

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

वे यह पता लगाने के लिए मुश्किल नहीं हैं कि कैसे उपयोग करें, और वे इस स्थिति में आमतौर पर उपयोग किए जाते हैं, इसलिए प्रोजेक्ट की README में बस एक नोट करें कि आप सबमॉड्यूल का उपयोग करते हैं और क्या करना है, और लोगों को यह पता लगाने में सक्षम होना चाहिए यह बाहर। पहली बार जब मैंने एक सबमॉड्यूल के साथ एक रिपॉजिटरी का सामना किया, तो मैंने इसे उठा लिया और 10 से 15 मिनट में चला गया और कभी भी यह पता नहीं लगा कि क्या करना है।


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

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

3

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

संक्षेप में - क्या आप केवल लिबास का उपयोग करना चाहते हैं या क्या आप उन्हें अपने कोडबेस का हिस्सा मानते हैं? यदि वे 'आपके' कोड नहीं हैं, तो वे संस्करण नियंत्रण में क्यों हैं और न केवल कुछ ऐसी चीजें हैं जिन्हें आपको स्थापित करने की आवश्यकता है?


6
Submodules आपको स्थानीय परिवर्तन करने से नहीं रोकता है। इसके विपरीत, वे आपको उन बदलावों को ट्रैक करने और विभिन्न परियोजनाओं में लाइब्रेरी के विभिन्न संस्करणों (आपके ट्वीक्स या लाइब्रेरी रिलीज़) का उपयोग करने की अनुमति देते हैं।
स्टीव फॉलोवर्स ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.