आसान तरीका ™
यह पता चला है कि यह एक ऐसी सामान्य और उपयोगी प्रथा है जिसे गिट के अधिपति ने वास्तव में आसान बना दिया है, लेकिन आपके पास गिट (> = 1.7.11 मई 2012) का एक नया संस्करण होना चाहिए। नवीनतम गिट स्थापित करने के लिए परिशिष्ट देखें । इसके अलावा, नीचे दिए गए पूर्वाभ्यास में एक वास्तविक दुनिया का उदाहरण है ।
पुरानी रेपो तैयार करें
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
नोट: <name-of-folder>
में अग्रणी या अनुगामी वर्ण नहीं होना चाहिए। उदाहरण के लिए, subproject
MUST नाम के फ़ोल्डर को पास subproject
नहीं किया जाना चाहिए./subproject/
विंडोज उपयोगकर्ताओं के लिए ध्यान दें: जब आपके फ़ोल्डर की गहराई> 1 है, <name-of-folder>
तो * निक्स शैली फ़ोल्डर विभाजक (/) होना चाहिए। उदाहरण के लिए, path1\path2\subproject
MUST नाम के फ़ोल्डर को पास किया जाना चाहिएpath1/path2/subproject
नया रेपो बनाएं
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
नए रेपो को GitHub या जहाँ भी लिंक करें
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
यदि वांछित है<big-repo>
, तो अंदर की सफाई करें
git rm -rf <name-of-folder>
नोट : यह रिपॉजिटरी में सभी ऐतिहासिक संदर्भों को छोड़ देता है। नीचे परिशिष्ट पर देखें यदि आप वास्तव में एक पासवर्ड के बारे में चिंतित हैं या आपको अपने .git
फ़ोल्डर के फ़ाइल आकार को कम करने की आवश्यकता है ।
...
पूर्वाभ्यास
ये उपरोक्त चरणों के समान हैं , लेकिन उपयोग करने के बजाय मेरे भंडार के लिए मेरे सटीक चरणों का पालन कर रहे हैं<meta-named-things>
।
यहाँ एक परियोजना है जिसे मैंने नोड में जावास्क्रिप्ट ब्राउज़र मॉड्यूल लागू करने के लिए दिया है:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
मैं एक एकल फ़ोल्डर btoa
को अलग Git रिपॉजिटरी में विभाजित करना चाहता हूं
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
मेरे पास अब एक नई शाखा है, btoa-only
जो केवल इसके लिए प्रतिबद्ध है btoa
और मैं एक नया भंडार बनाना चाहता हूं।
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
आगे मैं GitHub या Bitbucket पर एक नया रेपो बनाता हूं, या जो भी हो और इसे के रूप में जोड़ता हूं origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
शुभ दिन!
नोट: यदि आप एक साथ एक रेपो बनाया है README.md
, .gitignore
और LICENSE
, आपको पहले खींचने के लिए की आवश्यकता होगी:
git pull origin master
git push origin master
अंत में, मैं फ़ोल्डर को बड़े रेपो से निकालना चाहता हूं
git rm -rf btoa
...
अनुबंध
MacOS पर नवीनतम गिट
Homebrew का उपयोग कर Git का नवीनतम संस्करण प्राप्त करने के लिए :
brew install git
उबंटू पर नवीनतम गिट
sudo apt-get update
sudo apt-get install git
git --version
यदि वह काम नहीं करता है (आपके पास उबंटू का बहुत पुराना संस्करण है), तो कोशिश करें
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
अगर वह अभी भी काम नहीं करता है, तो कोशिश करें
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
टिप्पणी से rui.araujo को धन्यवाद।
अपना इतिहास साफ़ करना
डिफ़ॉल्ट रूप से Git से फ़ाइलों को हटाने से वास्तव में उन्हें हटाया नहीं जाता है, यह सिर्फ यह कहता है कि वे अब वहां नहीं हैं। यदि आप वास्तव में ऐतिहासिक संदर्भों को हटाना चाहते हैं (यानी आपके पास कोई पासवर्ड है), तो आपको यह करने की आवश्यकता है:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
उसके बाद आप देख सकते हैं कि आपकी फ़ाइल या फ़ोल्डर अब Git के इतिहास में बिलकुल दिखाई नहीं देता है
git log -- <name-of-folder> # should show nothing
हालाँकि, आप GitHub और पसंद को "पुश" नहीं कर सकते । यदि आप कोशिश करते हैं तो आपको एक त्रुटि मिलेगी और आपको git pull
इससे पहले कि आपको करना होगाgit push
- और फिर आपको अपने इतिहास में सब कुछ होने पर वापस आना होगा।
इसलिए यदि आप इतिहास को "मूल" से हटाना चाहते हैं - इसका अर्थ है इसे GitHub, Bitbucket, आदि से हटाना - आपको रेपो को हटाना होगा और रेपो की प्रून की गई कॉपी को फिर से पुश करना होगा। लेकिन रुकिए - और भी है ! - यदि आप वास्तव में पासवर्ड से छुटकारा पाने के बारे में चिंतित हैं या ऐसा कुछ है, तो आपको बैकअप की आवश्यकता होगी (नीचे देखें)।
बनाना .git
छोटा
उपरोक्त हटाए गए इतिहास आदेश अभी भी बैकअप फ़ाइलों के एक समूह के पीछे छोड़ देता है - क्योंकि दुर्घटना से आपके रेपो को बर्बाद नहीं करने में आपकी मदद करने के लिए Git सभी प्रकार का है। यह अंततः दिनों और महीनों में अनाथ फ़ाइलों को हटा देगा, लेकिन यह आपको थोड़ी देर के लिए वहां छोड़ देता है जब आपको एहसास होता है कि आपने गलती से कुछ हटा दिया है जो आप नहीं चाहते थे।
इसलिए यदि आप वास्तव में रेपो के क्लोन के आकार को कम करने के लिए कूड़ेदान को खाली करना चाहते हैं, तो आपको वास्तव में यह सब अजीब करना होगा:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
उस ने कहा, मैं इन चरणों को नहीं करने की सलाह दूंगा जब तक आप यह नहीं जानते कि आपको जरूरत है - बस अगर आपने गलत उपनिर्देशन को गलत किया है, तो क्या आप जानते हैं? जब आप रेपो को धक्का देते हैं, तो बैकअप फ़ाइलों को क्लोन नहीं किया जाना चाहिए, वे सिर्फ आपकी स्थानीय कॉपी में होंगे।
श्रेय
git filter-branch
नीचे दिए गए मेरे जवाब को देखने के साथ अब यह तुच्छ है ।