2010-07-27 25 views
7

मुझे submodules के समान कुछ चाहिए, लेकिन निर्भरता के रूप में मुख्य भंडार के बाहर मौजूद है।किसी अन्य गिट भंडार की साझा निर्भरता के रूप में एक गिट भंडार कैसे जोड़ें?

यहाँ समस्या है:

मैं एक सीएडी उपकरण (CADSOFT ईगल) के लिए डिजाइन फाइलों का प्रबंधन करने के लिए Git उपयोग करने के लिए (एक वास्तव में अजीब तरीके से) कोशिश कर रहा हूँ, और मैं एक मुश्किल समय लगाना हो रही है सीएडी उपकरण की साझा लाइब्रेरी पर प्रत्येक प्रोजेक्ट की निर्भरता को प्रबंधित करने के लिए गिट सबमिड्यूल का उपयोग करने का कोई तरीका है या नहीं।

मैं इस तरह एक फ़ोल्डर संरचना का उपयोग कर रहा:

~/eagle/ <-- Main library used by multiple projects 
    .git/  
    <library files> 

~/projects/ <-- Projects folder 
    Proj0/ 
     .git/ 
     <design files> 
    Proj1/ 
     .git/ 
     <design files> 

इस मामले में, यह प्रत्येक परियोजना के लिए एक Git submodule के रूप में eagle.git रिपोजिटरी जोड़ें मतलब नहीं है।

हालांकि, मुझे अभी भी "eagle.git" भंडार की वर्तमान स्थिति को स्नैपशॉट करने का एक तरीका चाहिए ताकि यदि पुस्तकालय भविष्य में अपडेट किया गया हो, तो इसे लाइब्रेरी फ़ाइलों के विशिष्ट संशोधन तक पहुंचने के लिए वापस ले जाया जा सकता है प्रोजे [x] प्रतिबद्ध होने पर इस्तेमाल किया जा रहा था।

आदर्श रूप में, मैं की तरह कुछ करना चाहते हैं निम्नलिखित:

~/eagle/ <-- Main library used by multiple projects 
    .git/  
    <library files> 

~/projects/ <-- Projects folder 
    Proj0/ 
     .git/ 
     <design files> 
     **eagle** <-- something that acts like a submodule 
         but which actually points to ~/eagle/ 
    Proj1/ 
     .git/ 
     <design files> 
     **eagle** <-- something that acts like a submodule 
         but which actually points to ~/eagle/ 

मैं करने में सक्षम होना चाहते हैं:

cd ~/projects/Proj0 
git submodule update 

और ~/ईगल/निर्देशिका स्वचालित रूप से करने के लिए वापस रोल है संशोधन Proj0 में चेक किया गया।

कोई भी गिट में कुछ भी जानता है जो इस तरह के व्यवहार की अनुमति दे सकता है?

+0

क्या आप स्पष्टीकरण दे सकते हैं कि क्यों आपके लिए सबमिड्यूल काम नहीं करेंगे? यह मुझे लगता है जैसे submodules बिल्कुल वही है जो आपको चाहिए। –

+0

सीएडी उपकरण (ईगल) के लिए लाइब्रेरी को "देखने" के लिए, इसे ईगल की पथ सेटिंग्स में जोड़ा जाना है। यदि मैंने प्रत्येक प्रोजेक्ट के लिए एक सबमिशन के रूप में "ईगल" लाइब्रेरी रेपो जोड़ा है, तो मुझे प्रत्येक प्रोजेक्ट के सबमिशन लाइब्रेरी पथ ईगल की पथ सेटिंग्स मैन्युअल रूप से जोड़ना होगा, जिससे ईगल में "ईगल" लाइब्रेरी की [x] प्रतियां दिखाई देगी पुस्तकालय प्रबंधक सीएडी उपकरण में उन अलग-अलग प्रतियों का क्या प्रबंधन और प्रबंधन करना पता लगाना एक दुःस्वप्न होगा। साथ ही, लाइब्रेरी प्रोजेक्ट फ़ाइलों की तुलना में परिमाण के आदेश हो सकती है, इसलिए डिस्क पर चारों ओर बैठे [x] प्रतियों की प्रतियां वास्तव में अपर्याप्त लगती हैं। – cdwilson

+0

इस बारे में सोचने का एक सहायक तरीका एक समानता के माध्यम से है। आइए कहें ईगल सीएडी उपकरण एक कारखाना है जो एक समय में एक विजेट बना सकता है। आइए कहें कि प्रत्येक प्रोजेक्ट [x] .git repo को कुछ विजेट [x] फैक्ट्री बनाने के लिए एक विनिर्माण ब्लूप्रिंट [x] द्वारा दर्शाया जाता है। Eagle.git रेपो को उस विजेट [x] बनाने के लिए आवश्यक कारखाने सेटअप (मशीनों, श्रमिकों, कच्चे माल) द्वारा दर्शाया जाता है। – cdwilson

उत्तर

4

प्रत्येक परियोजना के लिए, जोड़ने .git/हुक/पूर्व प्रतिबद्ध (और सुनिश्चित करें कि यह निष्पादन योग्य है)

git config alias.update-eagle '!git --git-dir=~/eagle/.git --work-tree=~/eagle checkout -q $(<.eagle_rev)' 

जब आप एक प्रतिबद्ध बनाने , यह ~/ईगल के वर्तमान सिर रिकॉर्ड करेगा, और git update-eagle ~/ईगल में प्रतिबद्धता की जांच करेगा। (फिर बस सुनिश्चित करें कि आप git checkout <branch> ~/ईगल में इससे पहले कि आप इसमें कोई बदलाव करें।)

+0

mkarasek, आप नई गर्मता हैं! मुझे अब तक हुक के बारे में कोई जानकारी नहीं थी ... हालांकि, किसी कारण से, --git-dir पथ में "~" का उपयोग करके त्रुटि "घातक: एक गिट भंडार नहीं है: '~/eagle/.git'"। हालांकि, अगर मैंने "$" को "$ HOME" से बदल दिया है (यानी '--git-dir = $ HOME/eagle/.git') यह ठीक काम करता है। कोई विचार क्यों "~" --git-dir और --work-tree के साथ काम नहीं करता है? – cdwilson

+0

आपको प्रतिबद्ध हुक के साथ यह त्रुटि मिलती है? हो सकता है कि आपके/bin/sh के साथ समस्याएं हो; #!/bin/bash के साथ पहली पंक्ति को प्रतिस्थापित करें और देखें कि क्या समस्या हल हो रही है या नहीं। (यदि, दूसरी ओर, आपको उपनाम के साथ यह त्रुटि मिल रही है, तो मुझे कोई जानकारी नहीं है।) – mkarasek

0

तो eagle एक ProjX के भीतर अपनी जगह नहीं है,
लेकिन प्रत्येक ProjXeagle की एक विशिष्ट संशोधन का उपयोग कर सकते, तो
:

    :

    प्रत्येक ProjX के लिए, आप की जरूरत है

  • में MainProjX गिट रेपो है, जिसमें आप पाएंगे:
    • एक ProjX
    • एक (ProjX से एक ही स्तर पर) eagle के संस्करण

प्रत्येक MainProjX माता पिता परियोजना का लक्ष्य ProjX और eagle के साथ संस्करणों रखना है , यह सही निर्भरताओं को रिकॉर्ड करना है।

~/projects/ <-- Projects folder 
    MainProj0 
     Proj0/ 
      .git/ 
      <design files> 
     eagle/ 
      .git/ 
      <library files> 

    MainProj1 
     Proj1/ 
      .git/ 
      <design files> 
     eagle/ 
      .git/ 
      <library files> 

अब, हाँ, कि 'eagle' दोहराव का एक बहुत है, लेकिन यह जरूरी है कि यदि प्रत्येक ProjX अपनी ही eagle संशोधन का उपयोग करने में सक्षम है।, तब

#!/bin/sh 
git --git-dir=~/eagle/.git log -1 --pretty=format:%H >.eagle_rev 
git add .eagle_rev 

प्रत्येक परियोजना के लिए:

+0

वॉनसी, त्वरित उत्तर के लिए धन्यवाद। हाँ, यह एकमात्र चीज थी जिसके साथ मैं भी आ सकता था ... समस्या यह है कि 'ईगल' रेपो वास्तव में बड़े पैमाने पर (एक संपूर्ण कैड लाइब्रेरी) हो सकता है जबकि प्रोज [एक्स] रेपो वास्तव में छोटे होते हैं। जैसा कि आपने कहा था, मुझे 'ईगल' रेपो की लगभग कई प्रतियां रखना होगा, और इससे भी बदतर, मुझे सीएडी टूल के लाइब्रेरी पथ को मैन्युअल रूप से व्यक्तिगत प्रोज [x]/eagle/dir में बदलना होगा उपकरण उन्हें देखने के लिए, जो इस विधि को व्यावहारिक रूप से अनुपयोगी बनाता है। – cdwilson

+1

@ लोथर्समाश: प्रत्येक लाइब्रेरी पथ के लिए पर्याप्त सापेक्ष पथ "' ../ eagle' "नहीं होगा? (चूंकि 'ईगल' 'ProjX' की तुलना में एक ही स्तर पर होगा) – VonC

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