2012-10-09 19 views
8

से पुश परिवर्तन मैं गिट-सबट्री (एवरी पेनारुन से) का उपयोग कर रहा हूं। मेरे वर्तमान गिट रेपो में मेरे पास निश्चित रूप से मेरी सभी प्रोजेक्ट फ़ाइलें/फ़ोल्डर्स और "lib" नामक एक उप-शब्द है। यदि अब मैं git clone का उपयोग करके इस गिट रेपो को क्लोन करता हूं तो मुझे सभी प्रोजेक्ट फाइलें और उपट्री "lib" (सबकुछ होना चाहिए) प्राप्त होता है। मैंने अभी क्या प्रयास किया: मैंने क्लोन रेपो में उपट्री "lib" के भीतर कुछ बदल दिया और git subtree push का उपयोग करके परिवर्तनों को वापस "lib" के रिमोट रेपो में धक्का देने की कोशिश की, लेकिन यह काम नहीं किया। समस्या क्या है? क्या मुझे इसे को गिट सबट्री एड के साथ पहले उपट्री के रूप में जोड़ना है?गिट-सबट्री: क्लोन रेपो

अग्रिम में Thx

+0

आपने अपने शीर्ष स्तर की परियोजना में उपट्री कैसे जोड़ा? क्या आपने अभी एक निर्देशिका बनाई है और इसमें क्लोन किया है? –

+0

हाय! मैंने "गिट सबट्री एड" का उपयोग करके अपने शीर्ष स्तर की परियोजना में उपट्री जोड़ा। हो सकता है कि मेरा प्रश्न पर्याप्त स्पष्ट न हो: अगर मैं किसी अन्य मशीन पर रेपो क्लोन करता हूं तो मेरे पास सभी प्रोजेक्ट फाइलें और उप-"lib" है। अब मैं क्लोन रेपो में उपट्री "lib" के भीतर कुछ बदलता हूं, मैं "गिट सबट्री पुश" का उपयोग कर रिमोट सर्वर पर परिवर्तनों को वापस धक्का नहीं दे सकता, यह मेरी समस्या है। – arge

+0

क्या उत्तर मदद मिली? –

उत्तर

14

अस्वीकरण, मुझे लगता है मैं केवल कुछ ही दिनों आप से आगे कर रहा हूँ सबट्री के बारे में learing :-)

तुम सिर्फ git subtree push आप को निकालने के लिए सबट्री पर्याप्त जानकारी नहीं दे रहे हैं प्रयोग कर रहे हैं और अपने परिवर्तन धक्का।

यदि आपने रेपो को सही तरीके से क्लोन किया है तो उपट्री पहले से ही वहां होगी। Subtree को बताया जाना चाहिए कि आप किस subtree से धक्का देना चाहते हैं (भले ही आपके पास केवल एक है) और यह भी पता होना चाहिए कि कहां धक्का देना है - विशेष रूप से, आप शीर्ष स्तर के रेपो को धक्का नहीं देना चाहते हैं।

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

जाहिर रेपो और refspec अपने रेपो मिलान करने के लिए परिवर्तित किया जाना चाहिए: इसलिए, आप की तरह कुछ करना चाहते हैं।

यदि आप यहां क्या हो रहा है (और यह मदद करता है) में देखना चाहते हैं तो subtree वास्तव में उन परिवर्तनों को विभाजित करता है जो उपट्री के अंदर फ़ाइलों को किसी दूसरी शाखा में प्रभावित करते हैं और फिर इसे उपट्री रेपो में धक्का देते हैं। ,

git checkout lib-changes 

और उन्हें मैन्युअल रूप से धक्का

git push [email protected]:arges-github/lib.git master 

यदि यह नहीं है: देख ऐसा, का उपयोग subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

करने के लिए तो शाखा आपके द्वारा किए गए पर एक नजर है तब काम करना यह हो सकता है कि आपने अपने रेपो में उप-विलय को विलय नहीं किया है। जब आप एक सबट्री जोड़ें:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

आप भी सबट्री मर्ज करने और अपने शीर्ष स्तर रेपो के लिए इसे वापस पुश करने के लिए की जरूरत है।

git subtree pull --squash --prefix lib [email protected]:arges-github/lib.git master 
git push 
+0

मैंने "एड" तक चरणों को निष्पादित किया था। यह सुझाव देने के लिए कोई दस्तावेज नहीं मिला कि बाद में "खींचें" की आवश्यकता है। क्या होगा यदि "एड" के बाद उपट्री पर शुरुआती पहला "पुल" नहीं किया जाता है? जिस समस्या का सामना करना पड़ रहा है वह यह है कि "स्क्वाश" के साथ "एड" के बाद भी, जब मैं "सबट्री पुश" करने का प्रयास करता हूं, तो यह समय की शुरुआत के बाद से उस सबट्री पर सभी काम करता है, भले ही मैं इसे केवल उन कामों को धक्का देना चाहता हूं जो subtree के बाद कंटेनर रेपो में वापस "जोड़ा" था। – Nishith

1

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

जब आप गलती से मामले को मिश्रण करते हैं, तो गिट सोचता है कि आपके पास दो सबट्री हैं जबकि फाइल सिस्टम पर केवल एक ही मौजूद होगा।

तो समाधान है कि मैं (मामले में यह किसी को भी मदद करता है) के साथ समाप्त हो गया है:

  1. एक स्क्रिप्ट है कि अपने सबट्री धक्का होगा बनाएँ। इसे publish_<your-subtree-name> पर कॉल करें।
  2. अपनी उप-पंक्ति खींचने वाली एक और स्क्रिप्ट बनाएं। इसे update_<your-subtree-name> पर कॉल करें।
  3. अपने HEAD पर एक अस्थायी शाखा बनाएं और अपडेट का परीक्षण करें। यदि आपकी स्क्रिप्ट सही है, तो आपकी अस्थायी शाखा नहीं चली जाएगी।
  4. अन्य जगह उपट्री रेपो क्लोन करें, एक परीक्षण प्रतिबद्धता में जोड़ें, इसे दबाएं और इसे आपके द्वारा लिखे गए अपडेट स्क्रिप्ट का उपयोग करके अपने रेपो में खींचने का प्रयास करें।
  5. यदि यह सब काम करता है, तो अपनी अस्थायी शाखा हटाएं और अब सुपर प्रोजेक्ट रेपो में दोनों स्क्रिप्ट में जांचें।
  6. फिर जब भी आपको सबट्री को धक्का या खींचने की आवश्यकता होती है, तो स्क्रिप्ट का उपयोग करें।

पीएस> - स्क्वैश पैरामीटर महत्वपूर्ण है, खासकर यदि आपके रिपोर्टरिटोरियों की विभिन्न शाखाएं उपट्री की विभिन्न शाखाओं को खींच रही हैं और यदि आपके पास अपनी परियोजना में एकाधिक सबट्री हैं।