विस्तृत समाधान
इस उत्तर के अंत में नोट देखें (अंतिम पैराग्राफ) एनपीएम का उपयोग करके गिट सबमॉडल्स के त्वरित विकल्प के लिए;)
निम्नलिखित उत्तर में, आप जानेंगे कि रिपॉजिटरी से फोल्डर कैसे निकाला जाता है और उससे एक git रिपॉजिटरी बनाते हैं और फिर इसे फोल्डर के बजाय सबमॉड्यूल के रूप में शामिल करते हैं ।
Gerg Bayer के लेख से प्रेरित होकर एक Git रिपॉजिटरी से दूसरे में फाइल को मूविंग हिस्ट्री, प्रिजर्विंग हिस्ट्री
शुरुआत में, हमारे पास कुछ इस तरह है:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
में दिए चरणों bellow, मैं इस संदर्भित करेंगे someLib
के रूप में <directory 1>
।
अंत में, हमारे पास कुछ इस तरह होगा:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
एक अन्य रिपॉजिटरी में एक फ़ोल्डर से एक नया गिट रिपॉजिटरी बनाएँ
चरण 1
विभाजित करने के लिए भंडार की एक नई प्रति प्राप्त करें।
git clone <git repository A url>
cd <git repository A directory>
चरण 2
वर्तमान फ़ोल्डर नया रिपॉजिटरी होगा ताकि वर्तमान रिमोट को हटा दें।
git remote rm origin
चरण 3
वांछित फ़ोल्डर का इतिहास निकालें और इसे प्रतिबद्ध करें
git filter-branch --subdirectory-filter <directory 1> -- --all
अब आपके पास directory 1
सभी संबंधित प्रतिबद्ध इतिहास के साथ अपने रेपो रूट की फाइलों से एक गिट रिपॉजिटरी होनी चाहिए ।
चरण 4
अपनी ऑनलाइन रिपॉजिटरी बनाएं और अपनी नई रिपॉजिटरी को आगे बढ़ाएं!
git remote add origin <git repository B url>
git push
आपको upstream
अपने पहले पुश के लिए शाखा निर्धारित करने की आवश्यकता हो सकती है
git push --set-upstream origin master
स्वच्छ <git repository A>
(वैकल्पिक, टिप्पणियां देखें)
हम के निशान (फ़ाइलें और इतिहास के लिए प्रतिबद्ध) को हटाना चाहते <git repository B>
से <git repository A>
तो इस फ़ोल्डर के लिए इतिहास केवल एक बार होता है।
यह जीथब से संवेदनशील डेटा को हटाने पर आधारित है ।
एक नए फ़ोल्डर में जाएं और
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
<directory 1>
उस फ़ोल्डर से बदलें जिसे आप निकालना चाहते हैं। -r
यह निर्दिष्ट निर्देशिका के अंदर पुनरावृत्ति करेगा :)। अब के origin/master
साथ धक्का--force
git push origin master --force
बॉस स्टेज (नीचे नोट देखें)
में से एक सबमॉड्यूल बनाएं<git repository B>
<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
सत्यापित करें कि क्या सब कुछ उम्मीद के मुताबिक काम किया और push
git push origin master
ध्यान दें
यह सब करने के बाद, मैंने अपने मामले में महसूस किया कि इसके बजाय अपनी निर्भरता को प्रबंधित करने के लिए npm का उपयोग करना अधिक उचित था । हम git url और संस्करण निर्दिष्ट कर सकते हैं, निर्भरता के रूप में package.json git urls देखें ।
यदि आप इसे इस तरह से करते हैं, तो जिस रिपॉजिटरी को आप आवश्यकता के रूप में उपयोग करना चाहते हैं वह एक npm मॉड्यूल होना चाहिए ताकि इसमें एक package.json
फ़ाइल होनी चाहिए या आपको यह त्रुटि मिलेगी Error: ENOENT, open 'tmp.tgz-unpack/package.json'
:।
tldr (वैकल्पिक समाधान)
आपको एनपीएम का उपयोग करना आसान होगा और गिट के साथ निर्भरता को प्रबंधित करना होगा :
- फ़ोल्डर को नए रिपॉजिटरी में ले जाएं
npm init
दोनों रिपॉजिटरी के अंदर चलाते हैं
npm install --save git://github.com/user/project.git#commit-ish
जहाँ आप अपनी निर्भरताएँ स्थापित करना चाहते हैं उसे चलाएं