2013-03-17 10 views
59

गिट में सिम्लिंक को संभालने का सही तरीका क्या है?गिट - सिम्लिंक को कैसे संभालें

Vendors 
    Module A 
    Module B 
    Module C 
App 
Code 
    Modules 
    Core Module 1 
    Core Module 2 
    Module A (symlinked to vendors) 
    Module B (symlinked to vendors) 
    Module C (symlinked to vendors) 

एक एक मुख्य अनुप्रयोग निर्देशिका जो आवेदन में मूल कोड के सभी शामिल है:

मैं निम्नलिखित संरचना है। इसके अतिरिक्त एक विक्रेता निर्देशिका है जिसमें मॉड्यूल शामिल हैं जो मुख्य ऐप निर्देशिका में सिम्लिंक हो जाते हैं और इसलिए एकीकृत होते हैं।

महत्वपूर्ण रूप से, दोनों विक्रेता निर्देशिका और मुख्य ऐप निर्देशिका दोनों एक ही भंडार में संस्करणित हैं।

इसलिए, क्या मुझे गिट को सिम्लिंक को संग्रहित रखने देना चाहिए, या सिमलिंक को अनदेखा करने का कोई तरीका ढूंढना चाहिए?

+0

एचएम मैंने इसे सापेक्ष बना दिया और यह गीथूब पर काम नहीं करता है :(क्या आप कृपया मेरी मदद कर सकते हैं? Https://github.com/lingohub/Example-Resource-Files/blob/master/AngularJS/example.en.json –

उत्तर

117

गिट सिम्लिंक को ठीक से संभाल सकता है जब तक कि सभी डेवलपर्स द्वारा उपयोग की जाने वाली ऑपरेटिंग सिस्टम उनका समर्थन न करे। चूंकि आप इन सिम्लिंक मौजूद होने पर निर्भर करते हैं, इसलिए मैं मानता हूं कि आपके विकास वातावरण सभी सिम्लिंक का समर्थन करते हैं।

तय करने के लिए कुछ है या नहीं (सिमलिंक या अन्यथा) अपना Git भंडार में शामिल किया जाना चाहिए यदि निम्नलिखित पर विचार:

  • यह कुछ उपकरण या भंडार में अन्य प्रक्रिया द्वारा उत्पन्न एक फ़ाइल है? यदि ऐसा है, तो इसे अनदेखा करना सबसे अच्छा है और प्रत्येक उपयोगकर्ता फ़ाइल उत्पन्न करने देता है, ताकि उनके पास हमेशा नवीनतम संस्करण होगा।
  • क्या फ़ाइल किसी विशेष उपयोगकर्ता के विकास पर्यावरण या किसी वातावरण में उपयोग की जाने वाली फ़ाइल के लिए विशिष्ट है? यदि यह किसी विशेष उपयोगकर्ता के पर्यावरण का एक क्विर्क है, तो एमैक्स बैकअप फ़ाइलों को अनदेखा करने के लिए कॉन्फ़िगरेशन की तरह, यह रेपो में संबंधित नहीं है। अगर ऐसा कुछ डेवलपर्स की आवश्यकता होगी, और/या उत्पादन के लिए आवेदन बनाने के लिए कुछ आवश्यक है, तो इसे भंडार में जाना चाहिए।

आपके मामले में ऐसा लगता है कि सिम्लिंक उत्पन्न नहीं होते हैं और उन्हें सभी वातावरण में जरूरी है, इसलिए उन्हें भंडार में रखना ठीक होना चाहिए।

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

cd App/Code/Modules 
ln -s "../../../Vendors/Module A" "Module A" 
+40

+1 "रिश्तेदार सिम्लिंक" को हाइलाइट करने के लिए +1 –

+0

एचएम मैंने इसे सापेक्ष बना दिया और यह गीथूब पर काम नहीं करता है :(क्या आप कृपया मेरी मदद कर सकते हैं? Https://github.com/lingohub/Example-Resource-Files/blob/master/ AngularJS/example.en.json –

+0

क्या इसका मतलब यह है कि यदि मैं विक्रेताओं/मॉड्यूल ए में कोई भी परिवर्तन करता हूं, और इसे गिट पर धक्का देता हूं, तो गिट स्वचालित रूप से ऐप/कोड/मॉड्यूल/मॉड्यूल ए की सामग्री अपडेट करेगा? – HasnainMamdani

8

गिट सिमलिंक को स्टोर करता है, बस इसके संस्करण नियंत्रण में किसी भी अन्य फ़ाइल की तरह - एक सिम्लिंक को छोड़कर यह केवल उस पथ के बारे में जानकारी संग्रहीत करेगा जो इसे सिमलिंक कर रहा है, और फ़ाइल को नियमित फ़ाइल के बजाय सिम्लिंक के रूप में टाइप करें।

यदि सिम्लिंक निर्देशिका में इंगित करता है, तो गिट symlinked निर्देशिका के अंतर्गत सामग्री को संग्रहीत नहीं करता है।

तो आपके मामले के लिए गिट के तहत संस्करणित सिम्लिंक को संग्रहीत करने में कोई हानि नहीं होनी चाहिए।

सिम्लिंक के साथ आपको जागरूक होने की एक और चीज यह है कि, गिट केवल ताजा क्लोन पर सिम्लिंक को फिर से बनाएगा, न कि फाइल या निर्देशिका जो इंगित कर रहा है। संभावना है कि symlinked पथ अस्तित्वहीन होगा (पूर्ण पथ का उपयोग करते समय कहें)।

+0

क्या सिमलिंक निर्देशिका में मौजूद फ़ाइलों को जोड़ने का कोई तरीका है? – kraftydevil

+0

@kraftydevil - git आपको सिम्लिंक निर्देशिका के तहत फ़ाइलों को तब तक जोड़ने देगा जब तक कि सिम्लिंक की लक्ष्य निर्देशिका स्वयं गिट संस्करण नियंत्रण में नहीं है। अन्यथा गिट नहीं होगा (और नहीं होना चाहिए) symlink निर्देशिका की सामग्री संस्करण। यदि आप मुख्य गिट भंडार निर्देशिका के बाहर symlink निर्देशिका के तहत संस्करण फ़ाइलों को करने का प्रयास कर रहे हैं, तो आप कुछ गलत कर रहे हैं। आप 'गिट submodules' जांचना चाह सकते हैं '(या बेहतर 'गिट subtrees') – Tuxdude

+0

मैं अपने जेनकिन्स उदाहरण स्रोत नियंत्रण के तहत डाल रहा हूँ। मैं प्रत्येक नौकरी के लिए अंतिम सफल सामग्री रखना चाहता हूं। मैं अल ले जाऊंगा अधिक स्पष्टीकरण के लिए थोड़ी देर बाद ओक। – kraftydevil

1

@Tuxdude बिल्कुल के साथ "आपसे सहमत नहीं कर सकते ... तो आप कुछ गलत कर रहे हैं "। उदाहरण के लिए, यदि आपको वेबसर्वर या यहां तक ​​कि एक एनएफएस पर एक अलग ड्राइव पर मीडिया फ़ोल्डर रखने की आवश्यकता है तो आपको इसे संस्करण नियंत्रण से बाहर रखना होगा।इसलिए सिमलिंक किए गए मीडिया फ़ोल्डर के अंदर की सामग्री संस्करण के माध्यम से सुलभ नहीं होगी जैसा आपने समझाया था। लेकिन यह एक परिदृश्य है जहां आपको ऐसा करना है। और यह वास्तव में बी में दर्द है ... मेरा परिदृश्य और भी जटिल है (मैं विस्तार से नहीं जाऊंगा), जो मैं वास्तव में खोज रहा हूं वह है सिमलिंक फ़ोल्डर के उपफोल्डर्स को संस्करण में जोड़ना, लेकिन इसकी सामग्री नहीं, लेकिन मुझे एक विकल्प होना चाहिए जहां मैं सबफ़ोल्डर प्रकार के किसी भी बदलाव को गिट में अनदेखा कर सकता हूं। उदाहरण के रूप में बुनियादी संरचना:

  • एप्लिकेशन/मीडिया/bla
  • एप्लिकेशन/मीडिया/blubb

मैं Git संस्करण में उन फ़ोल्डर की जरूरत है, उसकी सामग्री के बिना।

वेबसर्वर (समान संस्करण) उन फ़ोल्डर इस तरह दिखेगा पर (सिमलिंक):

  • एप्लिकेशन/मीडिया/bla => कहीं पूरी तरह से किसी और
  • एप्लिकेशन/मीडिया/blubb => कहीं पूरी तरह से किसी और फिर

देव के पास अपने स्थानीय पर्यावरण पर केवल मूल संस्करण संरचना होना चाहिए जैसा कि पहले चरण (कोई सिम्लिंक) में समझाया गया है। लेकिन वेबसर्वर में विभिन्न एनएफएस सिस्टम के लिए सिम्लिंक है।

अगर किसी को यह पता चल जाए कि इसे कैसे हल किया जाए तो मैं वास्तव में इसकी सराहना करता हूं, क्योंकि मुझे अभी तक इसका कोई समाधान नहीं मिला है।

एकमात्र तरीका यह है कि मैं अब ऐसा कर रहा हूं कि एक ऐसा निर्माता बनें जो स्थानीय वातावरण के लिए सही/अलग संरचना बनाता है और सर्वर और मीडिया सबफ़ोल्डर वर्तमान में पूरी तरह से गिटिनोरोर द्वारा अनदेखा कर रहे हैं। लेकिन यह कभी-कभी बनाए रखने के लिए मुश्किल/कठिन हो सकता है।

+0

यह एक आम मुद्दा है, और जैसा कि मैंने पहले कहा था, यह संस्करण नियंत्रण से संबंधित नहीं है। एक समाधान लक्ष्य वातावरण के आधार पर सिम्लिंक स्थापित करने के लिए प्रारंभिक स्क्रिप्ट होना है। प्रारंभिक स्क्रिप्ट को बूटस्ट्रैस्ट पर चलाया जाना चाहिए एक 'गिट क्लोन' के ठीक बाद अपना सेटअप पी। गिट के संस्करण नियंत्रण में प्रारंभिक स्क्रिप्ट जोड़ें।बीटीडब्ल्यू 'गिट' संस्करण खाली निर्देशिका नहीं करेगा, केवल संस्करण फाइलों को गिट करेगा और पथ जानता है। जब आप किसी भी 'git' आदेशों को चलाते हैं तो इसका उपयोग निर्देशिका संरचना को फिर से बनाने के लिए किया जाएगा। – Tuxdude

+0

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

+0

मैं वास्तव में कह सकता हूं कि क्यों गिट इस तरह सिमलिंक का इलाज करता है। गिट के लिए, सिम्लिंक एक टेक्स्ट फ़ाइल के बराबर है जिसका सामग्री सिम्लिंक के लक्ष्य का प्रतिनिधित्व करती है। जब आप गिट में सिम्लिंक जोड़ते हैं तो यह लक्ष्य गिट के इतिहास के हिस्से के रूप में जोड़ा जाता है। – Tuxdude

संबंधित मुद्दे