2011-03-09 11 views
11

मैं एक बड़े स्रोत पेड़ को दो अलग-अलग घटकों और एक साझा सबमिशन में विभाजित कर रहा हूं। इस विभाजन के लिए तैयार करने के लिए, मैंने पहले साझा सामग्री को एक "सामान्य" निर्देशिका में स्थानांतरित कर दिया, सभी संदर्भों को अपडेट किया, और प्रतिबद्ध किया। अब तक सब ठीक है। अब मैं उस निर्देशिका को एक सबमिशन में निकालना चाहता हूं।नाम के साथ इतिहास रखने के दौरान गिट उपनिर्देशिका निकालें

आम तौर पर मैं

git filter-branch --subdirectory-filter 

के साथ ऐसा होता है लेकिन इस मामले में, सभी रोचक इतिहास, कि उप-निर्देशिका के बाहर हुआ तो इतिहास खो दिया हो जाता है।

मैं समझता हूं कि पूर्ण इतिहास रखने के लिए यह समझ में नहीं आता है, क्योंकि यह किसी भी डेटा को फ़िल्टर नहीं करेगा। लेकिन मैं वास्तव में समय पर वापस जाने और निर्माण करने की क्षमता के लिए नहीं जा रहा हूं, मैं बस प्रत्येक फ़ाइल का सदस्य बनने में सक्षम होना चाहता हूं।

क्या व्यक्तिगत फाइलों के इतिहास को रखते हुए फ़िल्टर-शाखा व्यवहार को रखने का कोई तरीका है?

उत्तर

4

वास्तव में नहीं। --subdirectory-filter एक विशेष मामला है जिसमें यह वास्तव में पेड़ों की सामग्रियों को महत्वपूर्ण रूप से संशोधित कर रहा है (क्योंकि यह चीजों को एक या अधिक निर्देशिका घोंसले के स्तर पर ले जा रहा है)।

ऐसे में, उपनिर्देशिका के बाहर मौजूद फ़ाइलों के बीच वास्तव में एक अच्छा मैपिंग नहीं है जिसे आप फ़िल्टर कर रहे हैं और पेड़ जिन्हें परिणाम में भाग लेने के हिस्से के रूप में संग्रहीत किया जा सकता है।

याद रखें कि filter-branch पूरी तरह से आपके इतिहास को फिर से लिख रहा है - आउटपुट पूरी तरह से काम करने का एक नया सेट है, और पुराने कामों के लिए कोई भी "लिंक" नहीं है, इसलिए किसी भी अतिरिक्त जानकारी को नए हिस्से के रूप में व्यक्त किया जाना चाहिए करता है।

+2

यह सब मुझे समझ में आता है, लेकिन कम से कम सिद्धांत में मैं कल्पना कर सकता हूं कि फाइलों के मौजूदा सेट को निर्देशिका में लेना और प्रत्येक के लिए प्रतिबद्धता इतिहास का पता लगाना, नामों की गणना करना। इस तरह, प्रत्येक प्रतिबद्ध वस्तु में उपनिर्देशिका में फ़ाइलों को शामिल या शामिल नहीं किया जाता है। जो उन्हें शामिल नहीं करते हैं उन्हें छोड़ दिया जा सकता है, और जो लोग करते हैं उन्हें अन्य फाइलों को छोड़ने के लिए फिर से लिखा जा सकता है। मुझे अपने इतिहास की नोक पर एक कदम उठाने पर कोई फर्क नहीं पड़ता, मैं बस रास्ते में सभी बदलाव रखना चाहता हूं। –

+0

यदि आप अपने पहले के मॉड्यूल में "पहले इतिहास" में से एक 'गिट चेकआउट' करना चाहते थे, तो 'गिट' क्या होगा? अगर फ़ाइल "उपर्युक्त" होती है जो अब भंडार की शीर्ष स्तर निर्देशिका है, तो गिट को इसे संभालने का कोई अच्छा तरीका नहीं है। – Amber

+0

मैंने इस पर कोई समय नहीं लगाया है ... मुझे अभी भी लगता है कि यह पर्याप्त चतुरता के किसी व्यक्ति द्वारा किया जा सकता है। –

3

यहां बताया गया है कि मैं कैसे बस इसी तरह की समस्या हल करता हूं। मैंने एक अर्ध-निजी "विविध" भंडार में एक प्रोजेक्ट शुरू किया था, कुछ फाइलों का नाम बदल दिया था, और फिर मैं 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 

आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे