2014-07-22 10 views
8

टीएलडीआर; यह एक लंबी हवा वाली पोस्ट होने जा रहा है, लेकिन मुझे यकीन है कि आप में से कई एकता 3 डी डेवलपर्स भी उसी समस्या में चल रहे हैं। हमारी सामूहिक स्वच्छता को बचाने के लिए एक बार और सभी उत्तर के लिए एक स्पष्ट निश्चित आवश्यकता है।unity3d और गिट submodules यह संभव है?

तो मैं पिछले 2+ सालों से गिट का उपयोग कर रहा हूं लेकिन मैंने इसमें बहुत गहराई से डाला नहीं है। मैं बिटबकेट/गीथूब इत्यादि से पुश पुल को शाखा/विलय कर सकता हूं और यह नियमित जीत फॉर्म/पारंपरिक अनुप्रयोगों के लिए ठीक काम करता है।

यहां समस्या है। जब से लाइब्रेरी में संदर्भ जोड़ने के लिए आपको वास्तव में xna/silverlight से unity3d और एकता में स्थानांतरित किया गया है, तो आपको वास्तव में उस पुस्तकालय से स्रोत फ़ाइलों को अपनी एकता प्रोजेक्ट फ़ोल्डर में कॉपी करना होगा। यद्यपि एकता आपको * .dll फ़ाइलों को प्लगइन फ़ोल्डर में छोड़ने की अनुमति देती है, लेकिन स्पष्ट क्रॉस प्लेटफ़ॉर्म संगतता समस्याएं हैं, और इस प्रकार मैं वहां कभी नहीं जाना चाहता हूं।

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

प्रत्येक व्यक्ति पुस्तकालय परियोजना यह आत्म

एकता परियोजना और प्रत्येक परियोजना के लिए कोड फ़ाइलों के रूप में इस तरह के

Assets\<company name>\<project name>\ 
Assets\<company name>\<library name>\ 
Assets\<company name>\<another library name>\ 

मैं यह कर बातें अत्यधिक अन्य संपत्ति हैं कि के कई के विपरीत व्यवस्थित रखने के लिए एकता में आयोजन किया जाता है है एकता संपत्ति स्टोर पर। :(

तो मेरा स्तर संपादक परियोजना एकाधिक पुस्तकालय परियोजनाओं का उपयोग कर रही है जिसका कोड कॉपी पेस्ट के माध्यम से आयात किया गया है। इनमें से प्रत्येक पुस्तकालय स्वयं स्थानीय गिट भंडारों में होस्ट किए जाते हैं। इसलिए जब मैं पुस्तकालय से कोड फ़ाइलों को पेस्ट करता हूं परियोजनाओं मेरी मुख्य एकता परियोजना के लिए मैं अपने आप मुझे लगता है कि करने के लिए बनाने के परिवर्तन के लिए प्रतिबद्ध के लिए किसी भी क्षमता ढीला Git रेपो पुस्तकालय।

मैं इस पिछले साल क्या कर दिया है fallowing

  1. प्रारंभ एक मुख्य परियोजना किया गया है Assets\<company name>\<main project name>\
  2. किसी भी आयात करें लाइब्रेरी प्रोजेक्ट्स (प्रतिलिपि/पेस्ट कोड फाइलें) Assets\<company name>\<library name>\
  3. यदि मुझे पुस्तकालयों में से किसी एक में परिवर्तन करने की आवश्यकता है तो मैं आमतौर पर पुस्तकालय कोड फ़ाइल को संपादित करता हूं जो मुख्य परियोजना में हैं जिन पर मैं काम कर रहा हूं। (अन्यथा अधिक जटिलता उत्पन्न होती है)
  4. क्योंकि मुख्य प्रोजेक्ट भी एक गिट रेपो है जो मैं किसी भी लाइब्रेरी फ़ाइलों में किए गए परिवर्तनों को मुख्य परियोजना के रेपो के लिए भी प्रतिबद्ध करता हूं।
  5. थोड़ी देर बाद मैं पुस्तकालय के मूल स्थान के साथ Assets\<company name>\<library name>\ की फ़ोल्डर तुलना करने के लिए CodeCompare (एक diff उपयोगिता) का उपयोग करता हूं, जहां मैंने पहले लाइब्रेरी फ़ाइलों की प्रतिलिपि बनाई थी।
  6. मैं प्रत्येक बदली गई कोड फ़ाइल को diff द्वारा अलग-अलग तुलना करता हूं और लाइब्रेरी के मूल स्थान पर अपने मुख्य प्रोजेक्ट में किए गए परिवर्तनों को माइग्रेट करता हूं।
  7. अब यह किया गया है, लाइब्रेरी फिर से एक गिट रेपो है (दूसरी बार) मुझे कोड फ़ाइलों में किए गए विभिन्न परिवर्तनों के बारे में काम करना है।

उस पागलपन के साथ यहां एक और समस्या है। मुख्य परियोजना अभी एकमात्र मुख्य परियोजना नहीं है जो मेरे पास है। मेरे पास कुछ अन्य परियोजनाएं हैं जो इन अन्य पुस्तकालयों के सभी संदर्भ (कॉपी/पेस्ट के माध्यम से) हैं।तो अब जब मैंने पुस्तकालय के लिए कोड अपडेट किया है और इसे प्रतिबद्ध किया है, तो मुझे अब उन मुख्य परियोजनाओं के माध्यम से वापस जाना होगा जो लाइब्रेरी का उपयोग करते हैं और लाइब्रेरी गिट रेपो से उन मुख्य परियोजनाओं में परिवर्तनों पर प्रतिलिपि बनाते हैं।

कार्य प्रवाह summerized

MainProjectA-> कोड LibraryA- से नकल फ़ाइलें> LibraryA फ़ाइलें> MainProjectA- अंदर संशोधित LibraryA फ़ाइलें मूल LibraryA फ़ोल्डर में वापस diff तुलना के माध्यम से विलय कर दिया स्थान के> LibraryA कोड फ़ाइलों तो वापस करने के लिए की नकल की लाइब्रेरी आईई का उपयोग करने वाली अन्य परियोजनाएं: मेनप्रोजेक्ट बी, मेनप्रोजेक्टसी, मेनप्रोजेक्ट डी।

अच्छा भगवान! चूंकि मेरी विभिन्न परियोजनाएं बड़ी और बड़ी हो जाती हैं क्योंकि यह समस्या अधिक से अधिक हो जाती है। यह प्रणाली काम करती है लेकिन यह बहुत ही कठिन है।

इंटरमिशन

तो थोड़ा सा छोटा सा रेंट।/लेता है DeepBreath/sigh मैं गिट कमांड लाइन का उपयोग करने से इंकार कर दिया। यह एमएस-डॉस अला 1 9 80 के दशक के टूट गया। यह 20 मजाकिया 14 लोग हैं। 2014 और हम डेवलपर्स अभी भी कमांड लाइनों के साथ geeking कर रहे हैं। इस दिन और उम्र में, मैं और अधिक उम्मीद करता हूं। मैं मूल रूप से पूरी तरह से एक नई नई कमांड लाइन भाषा नहीं सीख रहा हूं, केवल विंडोज़ और ऐप्स के बीच चौथाई और चौथाई स्विच करना है, जैसे कि कोड बदलने के लिए मौलिक रूप से सरल कुछ करना। कुछ तेज़ माउस क्लिक के साथ पूरा किया जा सकता है और एक छोटा टाइप किया गया संदेश वह सब कुछ आवश्यक है। git = new hawtness + अनावश्यक कमांड लाइन जटिलता

यह कहकर कि मैं अक्सर काम करता हूं और बनाम/विलय आदि बनाने के लिए निर्मित बनाम 2014 की गिट सुविधाओं का उपयोग करता हूं लेकिन यह सबमिड्यूल का समर्थन नहीं करता है, जहां तक ​​मैं कह सकता हूं । तो इसके लिए मैं SourceTree का उपयोग करता हूं।

एंड इंटरमिशन।

जैसा मैंने कहा कि मैं अभी तक Git का इस्तेमाल किया है नहीं यह परे एक बहुत बुनियादी मुख्य कार्यक्षमता है और मैं केवल परीक्षण परियोजनाओं के माध्यम से प्रारंभिक परीक्षण किया है, लेकिन मैं Git मज़बूती से जिस तरह से काम करने के लिए नहीं मिल सकता है Git submodule नरक

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

मुझे क्या करना चाहते हैं तो इस

  1. MainProjectA बुलाया नई एकता परियोजना बनाएँ और यह एक स्थानीय रेपो
  2. LibraryA (स्थानीय रेपो), LibraryB से MainProjectA को Git submodule (रों) जोड़े बनाने के (स्थानीय है रेपो) आदि
  3. यदि मैं मेनप्रोजेक्ट के अंदर लाइब्रेरी से संबंधित कोड फ़ाइलों में परिवर्तन करता हूं, तो मैं उन विशिष्ट परिवर्तनों को लाइब्रेरी के रेपो में मेनप्रोजेक्ट के भीतर से वापस करने की क्षमता चाहता हूं।

मैं अब तक एक उपयोगिता लिखना शुरू कर चुका हूं जो फ़ाइलों को स्वचालित रूप से दो अलग-अलग फ़ोल्डरों के बीच सिंक करेगा जैसे ही यह परिवर्तन का पता लगाता है। लेकिन मैंने इसे छोड़ दिया क्योंकि यद्यपि यह सिंक्रनाइज़ेशन के मुद्दों को हल करेगा, यह गिट प्रतिबद्ध मुद्दों को हल नहीं करेगा।

एक अन्य समस्या

है कि मेरे सभी मौजूदा एकता परियोजनाओं एक स्थानीय रेपो है कि सेटअप के रूप में fallows

<Unity Main Project Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- MainProjectA 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

<Unity LibraryA Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- LibraryA 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

मुझे क्या करना चाहते हैं अपने मुख्य परियोजना में एक LibraryA फ़ोल्डर मेरी LibraryA की एक submodule है कि राशि है परियोजना, अधिक विशेष रूप से मैं केवल <Unity LibraryA Folder>\Assets\Company Name\LibraryA\ की सामग्री को अपने मुख्य परियोजना फ़ोल्डर में एक submodule के रूप में शामिल होना चाहते हैं <Unity Main Project Folder>\Assets\Company Name\LibraryA\

<Unity Main Project Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- MainProjectA 
     |- LibraryA (submodule) 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

लेकिन SourceTree/Git शिकायत है कि मैं एक मौजूदा रेपो fol करने के लिए एक submodule नहीं जोड़ सकते डेर। <Unity Main Project Folder>\Assets\Company Name\

मैं लेखन जारी रखने जा रहा था लेकिन ... हाँ मुझे लगता है कि यह पर्याप्त लेखन है, और मेरे लक्ष्य को अभी तक पर्याप्त रूप से वर्णित किया जाना चाहिए।

निष्कर्ष

मुझे लगता है कि मैं भी मौसम Git पूछ सकते एक उत्पाद है कि यह भी मुझे कि मैं क्या करने की कोशिश कर रहा हूँ करने की अनुमति देगा के रूप में काफी परिपक्व हो गया है? या क्या यह संभव है कि गिट की वास्तुकला को मैं जो करने की कोशिश कर रहा हूं उसका समर्थन करने के लिए संभव नहीं है?

प्रत्येक खोज खाली हो गई है, यूट्यूब कोई मदद नहीं है और समय की बर्बादी है, मुझे हर उदाहरण का उल्लेख नहीं करना है, जो कमांड लाइन उदाहरण है, और submodules पर स्पर्श नहीं करता है।

एक सामान्य विंडोज़ अनुप्रयोग में submodules एक समस्या नहीं होगी। समस्या विशेष रूप से इस परियोजना में सभी कोड फ़ाइलों को कैसे पसंद करती है, इस बारे में समस्या है। मैं और कैसे मैं अपनी संगठित फ़ोल्डर संरचना को बरकरार रखने की कोशिश कर रहा हूं।

कृपया मदद करें। कृप्या। कृपया पर्ड करें। मैं तुमसे हाथ जोड़ कर प्रार्थना करता हूं! मैं तुमसे हाथ जोड़ कर प्रार्थना करता हूं! मेरे फ्रिकिन केन पर बेगिंग! : पी

+1

सबमोड्यूल बुराई हैं। इसे गूगल पर देखें। आप अपने पुस्तकालयों के लिए डीएलएस क्यों नहीं बनाते हैं और संस्करणों को प्रबंधित करने और डीएलएस डाउनलोड करने के लिए NuGet की तरह कुछ उपयोग करते हैं? आप संकलन समय में भी लाभ प्राप्त करेंगे क्योंकि यूनिटी को आपके द्वारा फ़ाइल को सहेजने के दौरान हर चीज को संकलित करने की आवश्यकता नहीं होगी (वैसे, आपको लंबे संकलन के समय से बचने के लिए डीएल की आवश्यकता नहीं है, आप कोड को डालकर इससे बच सकते हैं प्लगइन्स फ़ोल्डर: \ संपत्ति \ प्लगइन्स \ ...) – Roberto

+0

मैं अधिकांश यूनिटी परियोजनाओं के लिए PureMVC के सी # पोर्ट का उपयोग करता हूं। यह एक डीएलएल के रूप में आता है और आईओएस, एंड्रॉइड, मैक और विंडो के लिए परियोजनाओं के साथ ठीक काम किया है। अन्यथा यूनिटीपेकेज आयात/निर्यात तंत्र का उपयोग क्यों न करें? एसेट्स स्टोर से सभी प्लगइन्स इसका उपयोग अपनी सामग्री वितरित करने के लिए करते हैं। मैं इसे एक परियोजना से अगले परियोजना में स्थानांतरित करने के लिए उपयोग करता हूं और ऐसा लगता है कि यह ठीक काम करता है। –

+1

यह मेरे पसंदीदा स्टैक ओवरफ्लो प्रश्न की तरह है! अच्छी तरह से व्यक्त और सचित्र, और वास्तव में मैं भी क्या कर रहा हूँ। क्या आपने इस मुद्दे के बारे में कोई नया समाधान पाया है या इस मुद्दे के बारे में अन्य अंतर्दृष्टि प्राप्त की है क्योंकि आपने दो साल पहले पोस्ट किया था? – Junuxx

उत्तर

3

शायद आप सिम्लिंक/हार्डलिंक्स का उपयोग करना चाहते हैं?

<Master Project Folder> <----- no .git here 
| 
|-<Unity Main Project Folder> 
| |- .git 
| |- Assets 
|  |-Company Name 
|  |- MainProjectA 
|  |- LibraryA   ------ symlink to --+ 
|  |- .gitignore <--------+    | 
| |- Library     |    | 
| |- ProjectSettings   add LibraryA | 
| |- .gitignore        | 
|            | 
|-<Unity LibraryA Folder>      | 
| |- .git          | 
| |- Assets         | 
|  |-Company Name       | 
| |- LibraryA  <-------------------------+ 
| |- Library 
| |- ProjectSettings 
| |- .gitignore 

यूनिटी के सिम्लिंक के बारे में शिकायत करने के बावजूद यह काम करना चाहिए। कम से कम ओएसएक्स पर।


एक और (और IMO अधिक सही) जिस तरह से LibraryA एक submodule के रूप में है और इसके लिए एक अलग परीक्षण परियोजना है (वर्तमान में आपके Unity LibraryA Folder)।

मैंने इस सेटअप में 2+ साल (2-3 लिंक किए गए भंडार) किए हैं और गिट ने अच्छा प्रदर्शन किया है। शायद आपका ग्राफिकल क्लाइंट इतना अच्छा नहीं है? Gitx-dev या github का डेस्कटॉप क्लाइंट (जो गैर-गीथब रिपोज़ के लिए भी काम करता है) आज़माएं - या केवल कमांड लाइन सीखें, यह काम करता है।

ओह और मौजूदा निर्देशिका में एक सबमिशन जोड़ने के साथ समस्याएं - पहले निर्देशिका को हटाएं और प्रतिबद्ध करें।

+0

मुझे समझ में नहीं आता कि आप लाइब्रेरी के "लाइब्रेरीए" फ़ोल्डर को कैसे सिमलिंक कर सकते हैं। मुझे लगता है कि आप लाइब्रेरी को मुख्य परियोजना के परिसंपत्ति फ़ोल्डर के तहत दिखाना चाहते हैं, लेकिन लाइब्रेरीए प्रोजेक्ट लाइब्रेरी नामक फ़ोल्डर में संकलित नहीं होता है। लाइब्रेरी की सभी संपत्तियां अपने संपत्ति फ़ोल्डर में रहेंगी, और संकलित चीजें लाइब्रेरी के "लाइब्रेरी" फ़ोल्डर में समाप्त हो जाएंगी, लेकिन वे "LIbraryA" नामक फ़ोल्डर में समाप्त नहीं होंगे। तो या तो आपका चित्र बिल्कुल सही नहीं है, या मुझे समझ में नहीं आता कि एकता कैसे काम करती है। –

-2

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

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

0

यहां मैंने जो किया है।

पहला - यदि आपने पहले से ही अपनी परियोजना में लाइब्रेरी की फाइलों की प्रतिलिपि बनाई है, और आपकी परियोजना लाइब्रेरी की ऑब्जेक्ट्स & स्क्रिप्ट का उपयोग कर रही है, तो आपको बहुत सावधान रहना चाहिए। सुनिश्चित करें कि जब आप शुरू करते हैं तो आपके गिट रिपॉजिटरी से बिल्कुल कुछ भी संशोधित नहीं होता है ...

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

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

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

गिट में सुनिश्चित करें कि लाइब्रेरीए का प्रतिनिधित्व करने वाले रेपो में इसमें कोई भी बदली गई फाइल नहीं है। बस उस निर्देशिका को आयात करना w/लाइब्रेरीए में हार्डलिंक लाइब्रेरीए की फ़ाइलों को छुआ नहीं होना चाहिए था। अगर ऐसा होता है, तो आपने शायद कुछ गलत किया है।

अपने प्रोजेक्ट के लाइब्रेरी फ़ोल्डर में सभी नए बदलावों की जांच करें।

अब आप एकता में विकास जारी रखने के लिए स्वतंत्र हैं।

एर, उम्मीद है कि।

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