2009-05-01 9 views
109

मुझे एक गिट रिपोजिटरी मिली है जिसमें अलग-अलग निर्देशिकाओं में कई परियोजनाएं हैं। मैं रिपोजिटरी को नए व्यक्तिगत भंडारों में विभाजित करना चाहता हूं, प्रत्येक प्रोजेक्ट के लिए एक और उसके बाद मास्टर रिपोजिटरी में प्रोजेक्ट्स को सबोड्यूल्यूल के रूप में शामिल किया गया है। यदि संभव हो तो व्यक्तिगत परियोजनाओं के संशोधन इतिहास को बनाए रखने के दौरान मैं यह सब करना चाहता हूं।इतिहास को बनाए रखने के दौरान मैं एक गिट रिपॉजिटरी से एक नई निर्देशिका में एक निर्देशिका को कैसे स्थानांतरित कर सकता हूं?

मैं प्रत्येक प्रोजेक्ट के लिए भंडार क्लोन कर सकता हूं और हर बार अन्य सभी परियोजनाओं को हटा सकता हूं, लेकिन प्रत्येक नए प्रोजेक्ट रिपोजिटरी में क्लोन इतिहास से बचने के लिए यह एक बेहतर तरीका है?

+2

जोड़ा गया Git-submodules टैग के बाद से यह एक submodule में एक रेपो का हिस्सा परिवर्तित करने के लिए बहुत उपयोगी है। – idbrii

+0

[इतिहास के साथ गिट में निर्यात उपट्री] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1662753/export-subtree-in-git-with-history) – user

उत्तर

97

आप किसी परियोजना के इतिहास को फिर से लिखने के लिए git filter-branch का उपयोग कर सकते हैं। प्रलेखन से:

के रूप में देखने के लिए भंडार अगर foodir/अपनी परियोजना जड़ दिया गया था, पुनर्लेखन और अन्य सभी इतिहास त्यागने के लिए:

git filter-branch --subdirectory-filter foodir -- --all 

अपने रेपो के कई प्रतियां, ऐसा करें कि प्रत्येक उपनिर्देशिका के लिए आप विभाजित करना चाहते हैं, और आपको जो भी खोज रहे हैं उसके साथ हवा में जाना चाहिए।

+0

को आजमा रहा था, क्या यह नया रेपो शुरू करता है जैसे कि कोई इतिहास नहीं था? मैं डॉक्टर से इकट्ठा कर रहा हूं। – hellatan

+0

@dtan नए रेपो में ऐसे सभी इतिहास होंगे जो 'फूडिर /' निर्देशिका को प्रभावित करते हैं, लेकिन इतिहास में से कोई भी जो रेपो में किसी और चीज को प्रभावित नहीं करता है। तो यदि आपके पास चार उपनिर्देशिकाएं थीं, जिनमें से प्रत्येक अलग परियोजनाएं थीं, और प्रत्येक पर 'गिट फ़िल्टर-शाखा' चलाती थीं, प्रत्येक के पास केवल उस इतिहास का होगा जो उपनिर्देशिका को प्रभावित करता था। –

+1

क्या होगा यदि मैं * खाद्य पदार्थ * को बाहर करना चाहता हूं, और इसके इतिहास को हटा दूं? – saeedgnu

1

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

अतीत में मैंने अभी इसे क्लोन कर लिया है और आगे बढ़ गया है। यह चीजों को बड़ा बनाता है लेकिन डिस्क स्थान सस्ता है; मेरा समय महंगा है।

मुझे किसी निर्देशिका को विभाजित करने के लिए किसी भी उपकरण की जानकारी नहीं है। मुझे लगता है कि आप उस पर सभी काम करने के लिए निर्देशिका पर गिट-लॉग कर सकते हैं, फिर गिट-फास्ट-एक्सपोर्ट जैसे कुछ के साथ काम करता है?

+0

मैंने अपरिवर्तित किया क्योंकि यह नकारात्मक होने के लायक नहीं था - मैं निश्चित रूप से इस दृष्टिकोण का पालन नहीं करता लेकिन देख सकता हूं कि वह ऐसा करके – Alvin

1

एक नया भंडार आप की जरूरत के रूप में एक फ़ोल्डर निर्यात करने के लिए:

  1. भंडार क्लोन करने के लिए जहां फ़ोल्डर आप निर्यात करना चाहते है।
  2. निर्यात किए गए फ़ोल्डर को स्टोर करने के लिए, अपने होस्टिंग प्रदाता पर गिटहब के रूप में एक खाली भंडार बनाने के लिए।
  3. ओपन क्लोन भंडार फ़ोल्डर और इस कमांड चलाएँ:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master 
    
संबंधित मुद्दे

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