कई परियोजनाओं के साथ सर्वर के लिए जीआईटी रिपॉजिटरी लेआउट


96

मेरे द्वारा तोड़फोड़ करने के तरीके के बारे में एक बात यह है कि मेरे पास कई परियोजनाओं के साथ एक ही मुख्य भंडार हो सकता है। जब मैं किसी प्रोजेक्ट पर काम करना चाहता हूं तो मैं उस प्रोजेक्ट की जांच कर सकता हूं। ऐशे ही

\main
    \ProductA
    \ProductB
    \Shared

फिर

svn checkout http://.../main/ProductA

एक नए उपयोगकर्ता के रूप में मैं एक विशिष्ट वर्कफ़्लो करने से पहले क्षेत्र में सर्वश्रेष्ठ अभ्यास का एक सा पता लगाना चाहता हूँ। मैंने अब तक जो भी पढ़ा है, उसमें से परियोजना के पेड़ की जड़ में एक .git फ़ोल्डर में सब कुछ संग्रहीत किया गया है। इसलिए मैं दो में से एक काम कर सकता था।

  1. प्रत्येक उत्पाद के लिए एक अलग परियोजना स्थापित करें।
  2. उप-फ़ोल्डरों में एकल बड़े पैमाने पर परियोजना और स्टोर उत्पादों की स्थापना करें।

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

मुझे लगता है कि लिनक्स कर्नेल परियोजना रिपॉजिटरी समान रूप से बड़ी हैं, इसलिए गिट के साथ इसे संभालने का एक उचित तरीका होना चाहिए, लेकिन मैंने अभी तक इसका पता नहीं लगाया है।

क्या बहुत बड़ी मल्टी-प्रोजेक्ट रिपॉजिटरी के साथ काम करने के लिए कोई दिशानिर्देश या सर्वोत्तम अभ्यास हैं?

जवाबों:


65

Git सीमा के संबंध में दिशानिर्देश सरल है :

यह विचार एक विशालकाय गैपो रेपो में सब कुछ संग्रहीत करने के लिए नहीं है , बल्कि एक मुख्य परियोजना के रूप में एक छोटे से रेपो का निर्माण करता है, जो अन्य रेपो के सही आवागमन का उल्लेख करेगा, प्रत्येक एक प्रोजेक्ट या अपने स्वयं के सामान्य घटक का प्रतिनिधित्व करेगा।


ओपी पॉल अलेक्जेंडर टिप्पणियाँ :

यह तोड़फोड़ द्वारा प्रदान किए गए "बाहरी" समर्थन के समान लगता है।
हमने इसे आज़माया और बाहरी रूप से संस्करण संदर्भों को लगातार अद्यतन करने के लिए इसे बेहद बोझिल पाया क्योंकि परियोजनाएं एक दूसरे पर निर्भरता के साथ समवर्ती रूप से विकसित होती हैं। क्या कोई और विकल्प है ??

@Paul: हां, मुख्य परियोजना से संस्करण को अपडेट करने के बजाय, आप या तो:

  • मुख्य परियोजना के भीतर से सीधे अपने उपप्रोजेक्ट विकसित करें (जैसा कि " सबमॉड्यूल्स की सही प्रकृति " में समझाया गया है ),
  • या आप उप-रेपो में एक originही उप-रेपो के लिए कहीं और विकसित होने का संदर्भ देते हैं: वहां से आपको बस उस उप-रेपो से कहीं और किए गए परिवर्तनों को खींचना होगा।

दोनों ही मामलों में, आपको नए कॉन्फ़िगरेशन को रिकॉर्ड करने के लिए, मुख्य परियोजना के लिए प्रतिबद्ध नहीं भूलना होगा। यहां अपडेट करने के लिए कोई "बाहरी" संपत्ति नहीं। सभी प्रक्रिया बहुत अधिक प्राकृतिक है।

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

मैंने उत्तर दिया:

ईमानदारी से, आप सही हो सकते हैं ... जब तक कि नवीनतम Git 1.7.1 रिलीज नहीं हो जाता
git diffऔर git statusदोनों ने मुख्य परियोजना से निष्पादित होने पर भी सबमॉड्यूल राज्यों को ध्यान में रखना सीखा।
आप बस सबमॉड्यूल संशोधन को याद नहीं कर सकते हैं।

ऐसा कहे जाने के बाद:


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

1
@ वॉन: यह तोड़फोड़ द्वारा प्रदान किए गए "बाहरी" समर्थन के समान लगता है। हमने इसे आज़माया और बाहरी रूप से संस्करण संदर्भों को लगातार अद्यतन करने के लिए इसे बेहद बोझिल पाया क्योंकि परियोजनाएं एक दूसरे पर निर्भरता के साथ समवर्ती रूप से विकसित होती हैं। क्या कोई और विकल्प है ??
पॉल अलेक्जेंडर

@Paul: हां, मुख्य परियोजना से संस्करण को अपडेट करने के बजाय, आप या तो अपने उपप्रोजेक्ट सीधे मुख्य परियोजना के भीतर से विकसित करते हैं (देखें stackoverflow.com/questions/1979167/git-submodule-upd// ), या आप संदर्भ में उप-रेपो एक उप-रेपो की ओर एक उत्पत्ति कहीं और विकसित की जा रही है: वहाँ से आपको बस उस सब-रेपो से कहीं और किए गए परिवर्तनों को खींचना होगा। दोनों ही मामलों में, आपको नए कॉन्फ़िगरेशन को रिकॉर्ड करने के लिए, मुख्य परियोजना को प्रतिबद्ध करने के लिए नहीं भूलना होगा। अद्यतन करने के लिए कोई "बाहरी" संपत्ति नहीं। सभी प्रक्रिया बहुत अधिक प्राकृतिक है।
वॉनच

3
@Paul: ईमानदारी से, आप सही हो सकते हैं ... यही हाल नवीनतम रिलीज 1.7.1 तक है। ( kernel.org/pub/software/scm/git/docs/RelNotes-1.7.1.txt ) git diffऔर git statusदोनों ने मुख्य परियोजना से निष्पादित किए जाने पर भी सबमॉड्यूल राज्यों को ध्यान में रखना सीखा। आप बस सबमॉड्यूल संशोधन को याद नहीं कर सकते हैं।
VonC

1
@PaulAlexander जब तक कुछ कहती है, मुझे लगता है कि वह वास्तव में अब सबमॉड्यूल का उपयोग कर रही है।
क्रैगॉक्स

2

GitSlave आपको एक के रूप में कई स्वतंत्र रिपोज का प्रबंधन करने की अनुमति देता है। प्रत्येक रेपो को नियमित git कमांड द्वारा जोड़-तोड़ किया जा सकता है, जबकि gitslave आपको अतिरिक्त रूप से सभी repos पर कमांड चलाने की अनुमति देता है।

super-repo
+- module-a-repo
+- module-b-repo

gits clone url-super-repo
gits commit -a -m "msg"

रेपो-प्रति-परियोजना में घटक के साथ फायदे हैं और मावेन जैसे उपकरणों के साथ सरलीकृत बिल्ड हैं। रेपो-प्रति-परियोजना कचरे के गलत तरीके के रूप में - डेवलपर क्या बदल रहा है, इसके दायरे को सीमित करके सुरक्षा जोड़ता है।


क्या आप gitslave बनाम git सबमॉड्यूल के पेशेवरों और विपक्षों के बारे में थोड़ा सा शामिल कर सकते हैं?
एमएम

1
Gitslave का बड़ा फायदा यह है कि यह आपके Git repos को अकेला खड़ा करता है। आप gitslave संबंध को प्रभावित किए बिना सादे git कमांड के साथ repos प्रबंधित कर सकते हैं। लेकिन जब आप किसी टैग को निष्पादित करना चाहते हैं, उदाहरण के लिए, सभी रिपॉजिट के बाद तो gitslave कर सकता है।
आंद्रे

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