2011-03-23 7 views
54

Git शुरुआत सवाल को एक Git भंडार बढ़ते:एक पदानुक्रम स्तर

मैं एक छोटे से निजी webproject जो msysgit साथ स्थानीय रूप से versioned है। कोई बाहरी भंडार नहीं है, क्योंकि यह केवल मेरे लिए है, इसलिए मैं जो कुछ भी चाहता हूं वह मूल रूप से कर सकता हूं।

मैंने इसे प्रोजेक्ट निर्देशिका में स्थापित किया है, यानी "वेबूट" में।

अब दूसरी निर्देशिका बनाना है, जो वेबूट के समानांतर रखा गया है। चलिए इसे संपत्ति कहते हैं।

तो संरचना अब इस प्रकार है के रूप में:

\ project directory 
----\webroot 
----\assets 

मैं, Git भंडार में इस नए निर्देशिका में शामिल करने में खुशी होगी, ताकि मैं चाहता हूँ फ़ाइलों के लिए भी संस्करण परिवर्तन संग्रहीत, लेकिन निश्चित रूप से मैं यह कर सकते हैं उपयोग नहीं करें "git add ../assets"। न ही मैं project_directory में एक नया गिट प्रोजेक्ट बनाने के इच्छुक हूं, क्योंकि यह मेरे पिछले सभी कामों को खो देगा।

तो मैं अपने काम को रखते हुए और "संपत्ति" को शामिल करने में सक्षम होने के दौरान, "projectrodirectory" में "वेबूट" से भंडार को स्थानांतरित करने के बारे में कैसे जा सकता हूं?

<projectdir> 
    /.git 
    /webroot 
    /assets 

ऐसा करने के लिए, आप एक नया webroot उपनिर्देशिका में अपने रेपो में मौजूदा फ़ाइलों स्थानांतरित करना होगा:

+0

बिल्कुल ठीक नहीं है कि आप क्या पूछ रहे हैं, लेकिन आप इसमें एक शाखा बना सकते हैं। –

उत्तर

56

तो, आप अपने Git रेपो इस तरह दिखना चाहते हैं।

cd <git repo root> 
mkdir webroot 
git mv <all your files> webroot 
git commit --all -m "moved all existing files to new 'webroot' directory" 

फिर, अपने स्थानीय फाइल सिस्टम पर आप ऊपर अपने क्लोन एक निर्देशिका स्थानांतरित करने के लिए चाहते हैं, जहां यह अब है:

cd <projectdir> 
mv webroot/* . 
rmdir webroot 

तो फिर तुम Git रेपो को assets निर्देशिका (और फ़ाइलें) जोड़ना चाहते हैं :

git add assets 
git commit -m "added assets to the repo" 
+1

ठीक है, जाहिर है, मैंने पर्याप्त जानकारी नहीं दी है। भंडार पहले से ही/projectdir/webroot/के अंदर है, क्योंकि यह मूल रूप से बनाया गया था। चूंकि परिसंपत्ति निर्देशिका पास हो गई थी, इसलिए मैं इसे पसंद करूंगा यदि भंडार कार्य कर रहा था जैसे कि यह/projectdir/में बनाया गया था, जो कि यह नहीं था। git mv मुझे भंडार के बाहर फ़ाइलों को स्थानांतरित करने नहीं देगा। – Sorcy

+0

@ सोर्सि: मुझे विश्वास है कि मैं समझता हूं कि आप क्या करना चाहते हैं। मैंने इसे स्पष्ट करने के लिए अपना उत्तर अपडेट किया। –

+0

धन्यवाद, यह वही समाधान है जिसे मैं ढूंढ रहा था। :) – Sorcy

5

आपकी प्रतिबद्धता स्थानीय रूप से "वेबूट" फ़ोल्डर से जुड़ी नहीं है जो वे गिट रेपो के भीतर संग्रहीत हैं।

आप नए स्थान "/ प्रोजेक्ट निर्देशिका" में भंडार को पुनः जांचने वाली वेबूट निर्देशिका को हटा सकते हैं, संपत्ति निर्देशिका जोड़ें और प्रतिबद्ध करें।

rm -Rf webroot 
git clone path-to-repo 
git add assets 
git commit -m "Added assets directory" 
git push 
8

मुझे लगता है कि आप इतिहास सभी संशोधन में सभी फाइलों को रोकने के लिए फिर से लिखने के लिए होती हैं जैसे कि वे हमेशा एक उपनिर्देशिका webroot/के बजाय जड़

Git फिल्टर शाखा में किया गया था मैनपेज जवाब है, यहाँ एक उन्नत संस्करण है कि सभी मौजूदा refs (शाखाओं) और टैग का पुनर्लेखन है:

time git filter-branch --index-filter 'git ls-files -s | 
     sed "s-\t\"*-&webroot/-" | 
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all 

देखभाल ताकि प्रक्रिया तेजी से बड़ा के लिए भी चलेंगे इस एक सूचकांक-केवल आपरेशन बनाने के लिए लिया गया है रेपोस। याद रखें (जब संतुष्ट हो) मूल रेफरी (.git/refs/original/*) से छुटकारा पाएं और अप्रचलित वृक्ष वस्तुओं को खोने के लिए रेपो को दोबारा हटा दें।

+1

क्या आप मूल रेफरी से छुटकारा पाने और रेपो को दोबारा दिखाने के बारे में बता सकते हैं? क्या यह सिर्फ जीसी है या कुछ और? – NateS

6

आप अपने .git dir को एक स्तर तक ले जा सकते हैं और अपनी वर्क्री अपडेट कर सकते हैं।

cd projectdir 
mv ./webroot/.git ./.git 
git config core.worktree /absolute-path-to-project-dir 
git add assets 
git commit -m 'adding assets folder' 

सकारात्मक नहीं है लेकिन मुझे पूरा यकीन है कि core.worktree का मार्ग पूर्ण होना चाहिए।

+0

यहां वह आदेश है जो मेरे लिए काम करता है। जबकि मैं उस फ़ोल्डर में हूं जहां मैं .git फ़ाइल को स्थानांतरित करना चाहता हूं: 'mv .git/../' – user2038085

0

निम्न आदेश आपके गिट इतिहास को फिर से लिख देगा। ऐसा लगता है कि सामग्री webroot में सभी के साथ थी। आमतौर पर पुनर्लेखन इतिहास परेशानीपूर्ण होता है यदि एकाधिक लोग रेपो के साथ काम कर रहे हैं। चूंकि आप इस पर अकेले काम कर रहे हैं, यह ठीक होना चाहिए।

git filter-branch --index-filter ' 
    git read-tree --prefix="webroot/" $GIT_COMMIT && \ 
    git ls-files \ 
     | sed "s/\/.*//" \ 
     | sort \ 
     | uniq \ 
     | grep -v "^webroot" \ 
     | xargs -L1 git rm -r --cached > /dev/null'