यहां बताया गया है कि मैं कैसे बस इसी तरह की समस्या हल करता हूं। मैंने एक अर्ध-निजी "विविध" भंडार में एक प्रोजेक्ट शुरू किया था, कुछ फाइलों का नाम बदल दिया था, और फिर मैं https://github.com/kragen/aikidraw पर परियोजना को गिटहब में अपलोड करना चाहता था।
$ git clone misc aikidraw
$ cat > aikidraw-wanted
aikidraw.js
aikidraw.html
caposketchra.html
caposketchra.js
jquery-1.2.6.js
^D
$ cd aikidraw
$ git filter-branch --tree-filter 'bash -c "comm -23 <(/bin/ls | sort) <(sort ~/devel/aikidraw-wanted) | xargs rm -rf"' HEAD
ठीक अब तक dotfiles को हटाने नहीं से अलग काम किया है करने के लिए, लगता है कि (जैसे .git
, अच्छा है, और .gitignore
, बुरा) लेकिन जाहिरा तौर पर Git (1.6.0.4) के अपने संस्करण git filter-branch --prune-empty
जरूरत नहीं है। रामबाण पर
$ time git clone aikidraw aikidraw-smaller
$ du -sh aikidraw/.git aikidraw-smaller/.git
8.6M aikidraw/.git
1.2M aikidraw-smaller/.git
$ time rsync -Pav aikidraw-smaller panacea.canonical.org:devel/aikidraw/
real 1m23.251s
और फिर: तो अब मैं नए, छोटे रेपो क्लोन (क्रम में यह तेजी से नेटवर्क पर इसे कॉपी करने के लिए) और एक अन्य मशीन है कि उस पर Git 1.7.2.5 है करने के लिए रेपो कॉपी .canonical.org:
$ cd ~/devel/aikidraw/aikidraw-smaller # Oops. I hate rsync sometimes.
$ git checkout # otherwise I get "Cannot rewrite branch(es) with a dirty working directory."
$ git filter-branch --prune-empty HEAD
$ cd ../..
$ mv aikidraw i-hate-rsync
$ mv i-hate-rsync/aikidraw-smaller/ aikidraw
तब मेरे नेटबुक पर वापस:
$ mv aikidraw aikidraw-big
$ git clone panacea.canonical.org:devel/aikidraw
$ du -sh aikidraw/.git
268K aikidraw/.git
अब, अगर आप पाँच फ़ाइलों के बजाय दो निर्देशिका के साथ इस कर रहे थे, तो आप इस बिंदु पर अंदर सब कुछ नाम बदलने के लिए चाहते हो सकता हैgit mv
का उपयोग करके, भंडार की जड़ में शेष उपनिर्देशिका। मेरे मामले में मैंने पहले ही अपना नामांकन किया है।
$ git remote add github [email protected]:kragen/aikidraw.git
$ git push github master
आशा है कि इससे मदद मिलती है!
स्रोत
2011-12-29 00:04:00
यह सब मुझे समझ में आता है, लेकिन कम से कम सिद्धांत में मैं कल्पना कर सकता हूं कि फाइलों के मौजूदा सेट को निर्देशिका में लेना और प्रत्येक के लिए प्रतिबद्धता इतिहास का पता लगाना, नामों की गणना करना। इस तरह, प्रत्येक प्रतिबद्ध वस्तु में उपनिर्देशिका में फ़ाइलों को शामिल या शामिल नहीं किया जाता है। जो उन्हें शामिल नहीं करते हैं उन्हें छोड़ दिया जा सकता है, और जो लोग करते हैं उन्हें अन्य फाइलों को छोड़ने के लिए फिर से लिखा जा सकता है। मुझे अपने इतिहास की नोक पर एक कदम उठाने पर कोई फर्क नहीं पड़ता, मैं बस रास्ते में सभी बदलाव रखना चाहता हूं। –
यदि आप अपने पहले के मॉड्यूल में "पहले इतिहास" में से एक 'गिट चेकआउट' करना चाहते थे, तो 'गिट' क्या होगा? अगर फ़ाइल "उपर्युक्त" होती है जो अब भंडार की शीर्ष स्तर निर्देशिका है, तो गिट को इसे संभालने का कोई अच्छा तरीका नहीं है। – Amber
मैंने इस पर कोई समय नहीं लगाया है ... मुझे अभी भी लगता है कि यह पर्याप्त चतुरता के किसी व्यक्ति द्वारा किया जा सकता है। –