मैं एक अन्य रिपॉजिटरी के भीतर एक गिट रिपॉजिटरी के साथ कैसे काम कर सकता हूं?


284

मेरे पास एक Git मीडिया रिपॉजिटरी है जहां मैं अपने सभी जावास्क्रिप्ट और सीएसएस मास्टर फाइलों और लिपियों को रख रहा हूं जिन्हें मैं विभिन्न परियोजनाओं पर उपयोग करूंगा।

अगर मैं अपनी खुद की Git रिपॉजिटरी में एक नया प्रोजेक्ट बनाता हूं, तो मैं अपने नए प्रोजेक्ट में अपने मीडिया रिपॉजिटरी से जावास्क्रिप्ट फ़ाइलों का उपयोग किस तरह से करता हूं, जिससे यह बनता है, इसलिए जब मैं परिवर्तन करता हूं तो मुझे स्क्रिप्ट की दोनों प्रतियां अपडेट नहीं करनी पड़ती हैं ?


कृपया देखें सबट्री जवाब @ रुस्लान-kabalin से नीचे। नोट: प्री-कमिट (या ओवरकमिट ) हुक रॉबर्ट डंडन द्वारा उठाए गए आपत्ति से निपटने का एक तरीका है
हेजहोग

जवाबों:


348

कुंजी गिट सबमॉडल्स है

Git सामुदायिक पुस्तक या उपयोगकर्ता पुस्तिका के सबमॉड्यूल्स अध्याय को पढ़ना शुरू करें

कहो कि आपके पास भंडार PROJECT1, PROJECT2 और मीडिया है ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

अन्य रेपो पर दोहराएं ...

अब, अच्छी बात यह है कि जब भी आप मीडिया में बदलाव करते हैं, तो आप यह कर सकते हैं:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

यह सिर्फ इस तथ्य को दर्ज करता है कि PROJECT2 में मीडिया सबमॉडल अब XYZ संस्करण में है।

यह आपको 100% नियंत्रण प्रदान करता है कि प्रत्येक परियोजना के किस संस्करण का उपयोग करता है। गिट सबमॉड्यूल महान हैं, लेकिन आपको उनके बारे में जानने और सीखने की जरूरत है।

महान शक्ति के साथ दुम में काटे जाने का शानदार मौका आता है।


यह वर्कफ़्लो एक निजी NPM मॉड्यूल stackoverflow.com/questions/7575627/…
cyrf

यदि आप नवीनतम संस्करण होने के लिए डिफ़ॉल्ट पसंद करते हैं, तो आप सभी आश्रित परियोजनाओं के लिए मीडिया को प्रतिबद्ध करने के लिए एक स्क्रिप्ट जोड़ सकते हैं।
जिग्गंजर

3
यह जीथब के साथ कैसे एकीकृत करता है?
Theonlygusti

27

सबमॉड्यूल के बजाय सबट्री का उपयोग करने पर विचार करें , यह आपके रेपो उपयोगकर्ताओं के जीवन को बहुत आसान बना देगा। आपको प्रो गिट बुक में अधिक विस्तृत मार्गदर्शिका मिल सकती है ।


6
यहाँ सबट्री बनाम सबमॉड्यूल
Benny Neugebauer

3
उस लेख के अनुसार, कमियों में से एक यह है:> सुपर और सब-प्रोजेक्ट कोड को कमिट्स में न मिलाने की जिम्मेदारी आपके साथ है। किसी को भी उस (IMO) के लिए समय नहीं मिला
रॉबर्ट डंडन

20

अगर मुझे आपकी समस्या अच्छी तरह से समझ में आ गई है, तो आप निम्नलिखित बातें चाहते हैं:

  1. अपनी मीडिया फ़ाइलों को एक एकल गिट रिपॉजिटरी में संग्रहित करें, जिसका उपयोग कई परियोजनाओं द्वारा किया जाता है
  2. यदि आप अपने स्थानीय मशीन के किसी भी प्रोजेक्ट में मीडिया फ़ाइल को संशोधित करते हैं, तो उसे तुरंत हर दूसरे प्रोजेक्ट में दिखाई देना चाहिए (इसलिए आप हर समय + पुश + खींचना नहीं चाहते)

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

सबसे पहले आपको एक महत्वपूर्ण बात तय करनी चाहिए: क्या आप अपने प्रोजेक्ट रिपॉजिटरी में हर संस्करण के लिए स्टोर करना चाहते हैं मीडिया फ़ाइलों के संस्करण का संदर्भ? उदाहरण के लिए यदि आपके पास example.com नामक एक परियोजना है, तो क्या आपको पता है कि 2 सप्ताह पहले किस शैली का उपयोग किया गया था, या नवीनतम हमेशा (या अधिकतर) सबसे अच्छा है?

यदि आपको यह जानने की आवश्यकता नहीं है कि, समाधान आसान है:

  1. मीडिया फ़ाइलों और प्रत्येक प्रोजेक्ट के लिए एक रिपॉजिटरी बनाएं
  2. अपनी परियोजनाओं में एक प्रतीकात्मक लिंक बनाएं जो स्थानीय रूप से क्लोन मीडिया रिपॉजिटरी की ओर इशारा करते हैं। आप या तो एक रिश्तेदार प्रतीकात्मक लिंक (जैसे ../media) बना सकते हैं और यह मान सकते हैं कि हर कोई परियोजना की जांच करेगा ताकि मीडिया निर्देशिका एक ही स्थान पर हो, या सांकेतिक लिंक का नाम .gitignore में लिख दें, और हर कोई तय कर सकता है। वह मीडिया फाइल रखता है।

हालांकि, अधिकांश मामलों में, आप इस संस्करण की जानकारी जानना चाहते हैं। इस मामले में आपके पास दो विकल्प हैं:

  1. हर प्रोजेक्ट को एक बड़े भंडार में स्टोर करें। इस समाधान का लाभ यह है कि आपके पास मीडिया रिपॉजिटरी की केवल 1 प्रति होगी। बड़ा नुकसान यह है कि परियोजना संस्करणों के बीच स्विच करना बहुत कठिन है (यदि आप एक अलग संस्करण की जांच करते हैं तो आप हमेशा सभी परियोजनाओं को संशोधित करेंगे)

  2. सबमॉड्यूल का उपयोग करें (जैसा कि उत्तर 1 में समझाया गया है)। इस तरह से आप मीडिया फ़ाइलों को एक रिपॉजिटरी में संग्रहीत करेंगे, और प्रोजेक्ट में केवल विशिष्ट मीडिया रेपो संस्करण का संदर्भ होगा। लेकिन इस तरह आपके पास आम तौर पर मीडिया रिपॉजिटरी की कई स्थानीय प्रतियां होंगी, और आप आसानी से सभी परियोजनाओं में मीडिया फ़ाइल को संशोधित नहीं कर सकते।

अगर मैं तुम होते तो मैं शायद पहला या तीसरा समाधान (प्रतीकात्मक लिंक या सबमॉड्यूल्स) चुनता। यदि आप सबमोडुल्स का उपयोग करना चुनते हैं तो आप अपने जीवन को आसान बनाने के लिए बहुत कुछ कर सकते हैं:

  1. कमिट करने से पहले, आप सबमॉड्यूल डायरेक्टरी का नाम बदल सकते हैं और एक आम मीडिया डायरेक्टरी में एक सिमलिंक लगा सकते हैं। जब आप प्रतिबद्ध होने के लिए तैयार होते हैं, तो आप सीमलिंक को हटा सकते हैं और सबमॉड्यूल को वापस निकाल सकते हैं, और फिर प्रतिबद्ध कर सकते हैं।

  2. आप मीडिया रिपॉजिटरी की अपनी एक कॉपी को अपनी सभी परियोजनाओं में एक रिमोट रिपॉजिटरी के रूप में जोड़ सकते हैं।

आप इस तरह से रिमोट के रूप में स्थानीय निर्देशिका जोड़ सकते हैं:

cd /my/project2/media
git remote add project1 /my/project1/media

यदि आप / my / project1 / मीडिया में किसी फ़ाइल को संशोधित करते हैं, तो आप इसे कर सकते हैं और इसे / my / project2 / media से बिना किसी दूरस्थ सर्वर पर धकेल दिए:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

आप इन कमिटों को बाद में हटाने के लिए स्वतंत्र हैं (गिट रीसेट के साथ) क्योंकि आपने उन्हें अन्य उपयोगकर्ताओं के साथ साझा नहीं किया है।


1
वेब से संबंधित परियोजनाओं के लिए जहां आप अपाचे के wwwफ़ोल्डर में काम करते हैं , आपको एक .htaccessफ़ाइल को wwwफ़ोल्डर की जड़ में या अपने प्रोजेक्ट के साथ, उसके साथ Options +FollowSymLinks, या बेहतर अभी तक <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> ( {new line}वास्तविक नई

3

मेरे पास उपशीर्षक और सबमॉड्यूल्स के मुद्दे थे जो अन्य उत्तर सुझाते हैं ... मुख्य रूप से क्योंकि मैं SourceTree का उपयोग कर रहा हूं और यह काफी छोटी लगती है।

इसके बजाय, मैंने SymLinks का उपयोग करना समाप्त कर दिया और यह अच्छी तरह से काम करने लगता है इसलिए मैं इसे एक संभावित विकल्प के रूप में यहां पोस्ट कर रहा हूं।

यहां एक पूरा गाइड है: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

लेकिन मूल रूप से आपको केवल एक उन्नत कमांड प्रॉम्प्ट में दो रास्तों को mklink करने की आवश्यकता है। सुनिश्चित करें कि आप / J हार्ड लिंक उपसर्ग का उपयोग करते हैं। इन लाइनों के साथ कुछ: mklink / JC: \ Projects \ MainProject \ plugins C: \ Projects \ SomePlugin

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

उदाहरण: mklink / J। \ Assets \ TaqtileTools .. \ TaqtileHoloTools

एक बार फ़ोल्डर लिंक हो जाने के बाद आपको अपने मुख्य भंडार में फ़ोल्डर को अनदेखा करना पड़ सकता है जो इसे संदर्भित कर रहा है। अन्यथा आप जाने के लिए अच्छे हैं।

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

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