2009-07-23 11 views
13

मेरे पास फू और बार रिमोट हैं। फू एक वेब एप्लिकेशन है जिसमें बहुत सी निर्देशिकाएं हैं, उनमें से प्रासंगिक /public है जिसमें मिश्रित फ़ाइलें और अन्य निर्देशिकाएं हैं।गिट: क्या मैं सिर्फ एक भंडार के उप-वर्ग को विलय कर सकता हूं?

बार पुस्तकालयों का एक सेट है और सामने के अंत में उपयोग नहीं किया गया है, इस तरह, इसे /public/bar में फू में जाना चाहिए। फू में कोई फाइल नहीं है।

यह सब केक के टुकड़े या तो सबमिड्यूल या सबट्री विलय के साथ होगा। हालांकि ...

बार का पेड़ गंदा है, इसमें सभी प्रकार की प्री-प्रोडक्शन फाइलें हैं जैसे कि PSDs और FLAs, और इसका एकमात्र वास्तव में उपयोगी हिस्सा /www/tools के अंदर है।

तो, मैं जो करना चाहता हूं वह बार के /www/tools को फू के /public/bar में विलय कर रहा है, और शेष बार के पेड़ का नाटक भी मौजूद नहीं है।

क्या कर सकते हैं?

(मुझे लगता है कि होगा यह बहुत ही आप कैसे एक परियोजना है कि मूल रूप से एक सबट्री के रूप में तुम्हारा विलय कर से विलय करने के लिए समान है। कौन सा मैं कैसे करना है, या तो पता नहीं है।)

उत्तर

0

मुझे नहीं लगता कि इस मर्ज का उपयोग करके किया जा सकता है, प्रति-से, लेकिन ये चरण चाल चल सकते हैं, कम से कम जहां तक ​​अंतिम उत्पाद का संबंध है। पहला:

% git fetch Bar 

यह बार भंडार से नवीनतम प्रतिबद्धता प्राप्त करता है, लेकिन उन्हें विलय करने की कोशिश नहीं करता है। यह .git में प्रतिबद्ध के लिए SHA रिकॉर्ड/FETCH_HEAD

% cat .git/FETCH_HEAD 
b91040363160aab4b5dd46e61e42092db74b65b7    branch 'Bar' of ssh://blah... 

इससे पता चलता है क्या नवीनतम के लिए SHA पहचानकर्ता प्रतिबद्ध से दूरदराज के शाखा है।

% git checkout b91040363160aab4b5dd46e61e42092db74b65b7 www/tools 

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

+0

हाँ मैं इतिहास को खुश रखने में खुश रहूंगा। शायद फ़िल्टर-शाखा के साथ कुछ किया जा सकता है। – kch

+1

1.) आप "गिट चेकआउट FETCH_HEAD www/tools" 2 का उपयोग कर सकते हैं।) शायद आप "गिट चेकआउट --मेर FETCH_HEAD www/tools" का उपयोग कर सकते हैं 3.) कामकाजी निर्देशिका में आवश्यक स्थिति रिकॉर्ड करने के बाद, आप हाथ से विलय कर सकते हैं गिट-प्रतिबद्ध –

+0

से पहले FETCH_HEAD को .git/MERGE_HEAD लिखकर, मुझे पता था कि FETCH_HEAD भाग –

2

संपादित करें: यह मेरे लिए होता है कि आप इसे git merge --no-commit के साथ कर सकते हैं। यह विलय का प्रयास करेगा, और यदि यह संघर्ष नहीं करता है, तो यह करने से पहले ही रुक जाएगा। इस बिंदु पर आप उन सभी जंक को हटा सकते हैं जिनकी आपको आवश्यकता नहीं है (यदि आवश्यक हो तो विवादित फ़ाइलों को पुनर्स्थापित करना) और केवल वांछित सबट्री युक्त विलय प्रतिबद्ध बनाना।

मूल जवाब:

आप वास्तव में इस के लिए फिल्टर शाखा उपयोग कर सकते हैं। एक रूपरेखा:

क्लोन अपने स्रोत रेपो:

git clone --bare /path/to/bar /path/to/bar_clone 

एक नंगे क्लोन का उपयोग करके आप समय और एक कार्यशील निर्देशिका बनाने की अंतरिक्ष बचत होगी।

इसके बाद, क्लोन पर इस्तेमाल फिल्टर शाखा:

git filter-branch --index-filter 'git rm -rf <unwanted files/directories>' -- --all 

--all यह पता है कि तुम सब refs ही नहीं, वर्तमान प्रधान का उपयोग करना चाहते हैं।अब आपके पास एक वांछित उपनिर्देशिका, और इसके साथ जुड़े सभी इतिहास वाले एक भंडार होगा।

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

git filter-branch --index-filter 'git rm -f `git ls-files | grep -v ^www/tools`' -- --all 

वैसे भी, लेकिन आप फ़ाइलों की प्रविष्टि को प्रबंधित दूर करने के लिए, आप आगे अपने सबट्री मर्ज के साथ जा सकते हैं, bar_clone से foo में खींच रहा है।

3

इसके लिए git subtree का उपयोग करने का प्रयास करें। यह आपको किसी प्रोजेक्ट की एक उप-प्रोजेक्ट को किसी अन्य प्रोजेक्ट में निकालने की अनुमति देता है, जिसे आप फिर से विलय कर सकते हैं।

+0

करने का बेहतर तरीका होना चाहिए क्या आप यह निर्दिष्ट कर सकते हैं? मैं यहां इस समस्या को हल करने की कोशिश कर रहा हूं: http://stackoverflow.com/questions/30704352/sub-directory-into-independent-repository-and-later-merge-back-into-main-reposit –

10

मैंने निम्नलिखित आदेशों का उपयोग करके इसे सफलतापूर्वक किया है (आपके परिदृश्य के लिए पुनः लिखा गया है)।

$ git remote add Bar /path/to/bar 
$ git merge -s ours --no-commit Bar/master 
$ git read-tree --prefix=public/bar -u Bar/master:www/tools/ 

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

मेरे परिवर्तन विलय की वर्तमान रास्ता इतना की तरह है:

$ get fetch Bar 
$ git pull -X subtree=public/bar Bar master 

यह कह रही है कि फ़ाइलों का एक टन हटा दिया गया है संघर्ष के साथ छोड़ जाएगा, तो आप सिर्फ git rm उन्हें और फिर git commit कर सकते हैं।

मैं निश्चित रूप से परिवर्तन खींचने के बेहतर तरीके पर सुझावों के लिए खुला हूं।

चूंकि यह एक पुराना धागा है, मुझे यह जोड़ना चाहिए कि मैं गिट 1.7.9 चला रहा हूं।

+0

इसके साथ एक समस्या यह है कि यह शाखा के सभी कामों में लाता है, न केवल उपनिर्देशिका को प्रभावित करने वाले। क्या उसके आस-पास कोई रास्ता है? – pmr

+0

यदि आप कई रिपॉजिटरीज विलय कर रहे हैं तो आप मर्ज करने के लिए '--allow-unrelated-histories' को पास करना चाहेंगे। –

0

मैं उप-दो बार उपयोग करने का सुझाव दूंगा - एक बार/www/टूल्स निकालने के लिए और एक बार निकालने/सार्वजनिक करने के लिए - ऐसा लगता है जैसे/जनता अपने स्वयं के रेपो में होना चाहिए, इसलिए मैं आपको सलाह दूंगा कि आप धक्का दें नया रेपो - इसके सभी उप-इतिहास के इतिहास के साथ, फिर नए/सार्वजनिक रेपो में/www/tools के उप-इतिहास को विलय करें और इसे वापस Foo के उप-उपखंड के रूप में जोड़ें।

cd foo 
git subtree split --prefix=public --branch=new-shared-public --annotate='(split) ' 
cd../bar 
git subtree split --prefix=www/tools --rejoin --branch=new-shared-www-tools --annotate='(split) ' 

अब आपके पास अपने प्रतिनिधि पर दो नई शाखाएं हैं। एक जनता के प्रतिबद्ध इतिहास के साथ और दूसरा www/उपकरण के साथ। मैं यहाँ से cd छोड़ दूंगा।

अपनी नई सार्वजनिक रेपो बनाएँ (यहाँ मैं यह सोचते हैं रहा हूँ GitHub लेकिन लगता है कि आप इसे स्थानीय स्तर पर कार्य करना चाहेंगे की तरह) और वहाँ अपने सबट्री धक्का: Git चेकआउट नए साझा-सार्वजनिक Git धक्का [email protected]: my_id/नई साझा-repo.git HEAD: मास्टर

फिर उस में अपने अन्य शाखा विलय:

git checkout new-shared-www-tools 
git remote add Foo [email protected]:my_id/new-shared-repo.git 
git merge -s ours --no-commit Bar/master 

हालांकि मैं प्रतिबद्ध नीति के रूप में ours निर्दिष्ट किया है, यह शायद (शायद) नहीं करता है कोई फर्क नहीं पड़ता।

आखिरकार, विलय को पूर्ववत करने के बाद और इसे नए रेपो पर धक्का देने के बाद, फू रेपो पर वापस जाएं।गिट आरएम वहां से सार्वजनिक इतिहास जोड़ें और नए सार्वजनिक रेपो को एक उपट्री के रूप में जोड़ें:

git subtree add --squash --prefix shared [email protected]:my_id/new-shared-repo.git master 
git subtree pull --squash --prefix shared [email protected]:my_id/new-shared-repo.git master 
git push 
संबंधित मुद्दे

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