इतिहास को बनाए रखने के लिए मैं एक गीट भंडार से एकल निर्देशिका को एक नए भंडार में कैसे स्थानांतरित कर सकता हूं?


110

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

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


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

जवाबों:


99

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

यह देखने के लिए भंडार को फिर से लिखना जैसे कि खाद्यान्न / उसकी परियोजना जड़ थी, और अन्य सभी इतिहास को छोड़ दें:

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

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


1
क्या होगा अगर मैं अन्नदाता को बाहर करना चाहता हूं, और यह सब इतिहास को हटा देना है?
सईदग्नू

1
नोट: यदि आप कई निर्देशिकाएँ चाहते हैं, तो आपको --subdirectory-filterकई बार निर्दिष्ट करने की आवश्यकता होगी । ईजी git filter-branch --subdirectory-filter foodir --subdirectory-filter bardir, आदि --subdirectoryकई डायर नहीं लेंगे, लेकिन कई बार निर्दिष्ट किए जा सकते हैं।
एनब्रेनटेन

3
@ एडम यदि आप foodirमूल परियोजना के इतिहास को रखना चाहते हैं , तो उसके इतिहास को फिर से लिखना नहीं, बस git rm -r foodirपर्याप्त होना चाहिए (जो आपके काम करने वाले पेड़ में प्रतिलिपि को हटा देगा; यदि आप ऐसा नहीं चाहते हैं, तो उपयोग करें --cached)। यदि आप इसे पूरी तरह से इतिहास से हटाना चाहते हैं (@ ilius के प्रश्न का उत्तर भी), तो आप कुछ ऐसा चाहते हैंgit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
ब्रायन कैंपबेल

2
@ilius क्षमा करें, मैंने आपका प्रश्न पहले ही याद कर लिया था, एक निर्देशिका और उसके इतिहास को हटाने के लिए एक उत्तर के लिए ऊपर दिए गए मेरे उत्तर को देखें।
ब्रायन कैंपबेल

2
@ विलियस येप, वह भी काम करता है। एक बड़ी परियोजना के लिए, --index-filterसमाधान की तुलना में तेज़ है --tree-filter, क्योंकि इसे वास्तव में फ़ाइलों की जांच करने की आवश्यकता नहीं है, यह सीधे सूचकांक में हेरफेर कर सकता है। --tree-filterलेकिन उपयोग करने के लिए, जैसा कि आप बल्कि सूचकांक हेरफेर कार्यों के साथ काम करने के लिए की तुलना में साधारण filsystem संचालन का उपयोग कर सकते थोड़ा आसान हो सकता है।
ब्रायन कैंपबेल

4

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

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

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    

1
git subtreeसिगविन पैकेज के रूप में उपलब्ध नहीं है। अगर आपको इसकी आवश्यकता है: stackoverflow.com/a/27116828/2484903
जैक मिलर

2

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

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

मुझे किसी निर्देशिका को अलग करने के लिए किसी भी उपकरण का पता नहीं है। मुझे लगता है कि आप निर्देशिका पर git-log कर सकते थे कि उस पर सभी कमिट्स मिल जाएं और फिर git-fast-Export जैसी किसी चीज़ के साथ कॉम्प्ले को फिर से करें?


मैंने अपवित्र किया क्योंकि यह नकारात्मक होने के लायक नहीं था - मैं निश्चित रूप से इस दृष्टिकोण का पालन नहीं करूंगा, लेकिन देख सकता है कि वह कोशिश कर रहा था
एल्विन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.