कई Git रिपॉजिटरी को समूहीकृत करना जो एक ही समग्र परियोजना का हिस्सा हैं


14

मान लीजिए कि मेरे पास एक परियोजना है जिसमें कई घटक हैं: एक सर्वर घटक, एक वेब ऐप घटक, एक आईओएस घटक, एक एंड्रॉइड घटक, आदि। ये घटक सभी अलग-अलग कोडबेस हैं, लेकिन शिथिल युग्मित भी हैं (उदाहरण के लिए सर्वर में परिवर्तन)। कोड को अन्य सभी घटकों में भी बदलाव की आवश्यकता हो सकती है)

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

दूसरी ओर, यदि आप प्रत्येक घटक को एक अलग रिपॉजिटरी के रूप में बनाते हैं, तो आप इन रिपॉजिटरी को "लिंक" कैसे कर पाएंगे ताकि आपको पता चले कि ऐप के संस्करण 2.0 में सर्वर घटक, आदि के संस्करण 1.5 की आवश्यकता है?

क्या कई बार संबंधित, संबंधित रिपो को प्रभावी ढंग से प्रबंधित करने के लिए रेडीमेड (या कुछ बेहतर समाधान जो मुझे नहीं दिखते हैं) तक रखने के बाहर गिट में एक विशेषता है?


क्या ये घटक वास्तव में एक दूसरे पर निर्भर होते हैं, जैसे किसी भरोसेमंद घटक और पुस्तकालय के बीच संबंध? या आप सिर्फ अपने सभी भरोसेमंद घटकों को सिंक में रखने की कोशिश कर रहे हैं?
बेकार

यहाँ StackOverflow (चमत्कारिक ढंग से अभी तक बंद नहीं) पर एक पुरानी चर्चा है
Dan Dascalescu

जवाबों:


6

सब-प्रोजेक्ट्स वह जगह है जिसे वर्जन कंट्रोल सिस्टम (डीवीसीएस) से शुरू किया गया था, अगर शुरू नहीं किया गया, तो निश्चित रूप से थोड़ा विस्की बन गया।

Git submodules और मर्क्युरियल subrepositories उप-परियोजना के समर्थन के लिए दोनों उद्देश्य। दोनों ने रिलीज़-दर-रिलीज़ सुधार किया है (इस बिंदु पर कि मर्कुरियल की पुरानी "यह सुविधा मौजूद है, लेकिन आपको शायद इसका उपयोग नहीं करना चाहिए" चेतावनी अब सामने और केंद्र नहीं है।)

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

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

यह कहना नहीं है कि सबमॉड्यूल्स / सबप्रॉप का प्रबंधन आपके लिए काम नहीं करेगा, लेकिन यह कुछ ऐसा है जिसे सावधानी से किया जाना चाहिए, और निश्चित रूप से कुछ पूर्व प्रयोग और नियोजन।

यह देखते हुए कि आप Git पर ध्यान केंद्रित कर रहे हैं, आपको Git उपप्रकार का भी पता लगाना चाहिए, जो कि कुछ सबमिट के लिए एक बेहतर विकल्प है


1
2016 में फिर से आना : एचजी डॉक्स अभी भी अंतिम उपाय की एक विशेषता को सबप्रॉप कहते हैं । Git डॉक्स अधिक उत्साही हैं, और इसकी सबमॉडल सुविधा अब अधिक एकीकृत है। दोनों अब नेस्टेड रेपो को भी अच्छी तरह से संभालते हैं ( नेस्टेड रेपो को पहचानते हुए "गेंद है" फाइलों के साथ जो इसे प्रबंधित कर रहा है), एक और उपयोगी उप-रेपो विकल्प। लेकिन DVCS उपकरण अभी भी सिंगल-लेवल रिपोज पर प्रमुख हैं, इसलिए "सब-रिपोस => मल्टीपल लेवल मैनेजमेंट" और "ड्रेगन यहाँ हो" चेतावनी प्रासंगिक रहे।
जोनाथन Eunice

2

यदि आप C # का उपयोग करते हैं, तो आप NuGet का उपयोग कर सकते हैं।

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

अंत में, पुस्तकालयों को NuGet पैकेज में पैकेज करने के लिए अपने बिल्डरों को प्राप्त करें, और फ्रंट-एंड घटकों (iOS, Android) के लिए परियोजनाओं में उन NuGet पैकेजों का उपभोग करें।

एक ही मूल दृष्टिकोण (संस्करण और पैकेज निर्भरता) अन्य भाषाओं में भी इस्तेमाल किया जा सकता है, लेकिन उतना सुविधाजनक नहीं हो सकता है।

मैं आपको Git Submodules का उपयोग करने की सलाह नहीं दूंगा। हालांकि यह सिद्धांत में इस तरह के मुद्दों के लिए इस्तेमाल किया जा सकता है, मुझे लगता है कि यह इसके लायक होने की तुलना में एक बड़ी परेशानी है।


2

मेरी राय में, यह इस बात पर निर्भर करेगा कि वे वास्तव में कितने युग्मित हैं। git bisectएक प्रतिगमन को ट्रैक करते समय एक स्वचालित चलाने में सक्षम होना वास्तव में अच्छा है , लेकिन यह करना मुश्किल होगा यदि प्रत्येक प्रतिबद्ध चलाने के लिए आपके अन्य निर्भरता के एक अलग संस्करण पर निर्भर करता है।

दो संभावित विकल्प सबमॉडल्स के साथ एक रिपॉजिटरी होंगे या जगह में अच्छी संस्करण प्रथाओं के साथ कई रिपॉजिटरी होंगे।

आप इन रिपॉजिटरी को "लिंक" कैसे कर पाएंगे ताकि आपको पता चले कि ऐप के संस्करण 2.0 में सर्वर घटक, आदि के संस्करण 1.5 की आवश्यकता है?

यह आमतौर पर कुछ निर्भरता प्रबंधन ढांचे (जैसे ग्रेडल, मावेन) का डोमेन है, न कि खुद गिट।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.