2012-03-01 14 views
5

मैं अपने भंडार में एक निर्देशिका संरचना है:Git फिल्टर शाखा: छोड़ निर्देशिका संरचना

|-repository/ 
| | |-repository/fileOne 
| | 
| |-subOne/ 
| | |-subOne/fileTwo 
| | 
| |-subTwo/ 
|  |-subTwo/fileThree 

मैं एक अलग भंडार में निर्देशिका subOne ले जाना चाहते हैं। ऐसा करने के लिए, मैं subOne तो जैसे git-filter-branch का उपयोग कर अलग कर रहा हूँ:

$ git filter-branch --subdirectory-filter subOne --prune-empty 

यह मैं एक शाखा इतिहास है कि इस तरह दिखता है के साथ छोड़ देता है:

$ git log --oneline 
0c0ea11 subOne history 
6318bba subOne history 
c96fddb Initial commit 

यह ठीक है कि मैं क्या चाहते हैं; एक और भंडार से मैं git fetch और git merge कर सकता हूं, जो subOne और अन्य भंडार में इतिहास जोड़ता है। एक दम बढ़िया।

हालांकि, git-filter-branch ने subOne हटा दिया है। अपनी शाखा पर निर्देशिका संरचना जाँच हो रही है:

$ ls 
fileOne 
$ pwd 
/this/is/a/path/repository 

pwd पढ़ना चाहिए: /this/is/a/path/repository, लेकिन lssubOne भंडार के अंदर दिखाना चाहिए। इसके बजाय मुझे क्या मिला है subOne की फाइल ऊपर की ओर बढ़ी है, और निर्देशिका हटा दी गई है।

मैं निर्देशिका खोने के बिना subOne कैसे निकाल सकता हूं?

+0

मैं _think_ फ़िल्टर-शाखा 'zsh' – knittl

उत्तर

4

pwd को पढ़ना चाहिए:/यह/is/a/path/repository है, लेकिन ls को भंडार के अंदर सबऑन दिखाना चाहिए। इसके बजाय मुझे जो मिला है वह सबऑन की फाइल ऊपर की ओर बढ़ी है, और निर्देशिका हटा दी गई है।

यह पता चला इस डिफ़ॉल्ट आपरेशन git-filter-branch --subdirectory-filter की है। man git-filter-branch से उद्धरण:

परिणाम में उस निर्देशिका (और केवल वह) होगा जो इसकी परियोजना रूट के रूप में होगी।

इस ठीक करने के लिए, मैं /subdirectory को / में सब कुछ शिफ्ट करना चाहते हैं। सौभाग्य से, वहाँ man git-filter-branch में वूडू दिखने कोड का एक टुकड़ा है, EXAMPLES के तहत:

To move the whole tree into a subdirectory, or remove it from there: 
     git filter-branch --index-filter \ 
       'git ls-files -s | sed "s-\t\"*-&newsubdir/-" | 
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
           git update-index --index-info && 
       mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

संपादित करें: इस Mac OS X पर काम नहीं करेगा। अधिक जानकारी के लिए मेरे प्रश्न here देखें। BSD sedGNU sed जैसा नहीं है, जो कष्टप्रद है। ओएस एक्स पर उस उदाहरण को चलाने के लिए, sed से gsed बदलें; फिल्टर तब बहुत अच्छी तरह से काम करता है।

+0

के बजाय' sh' को कॉल कर सकता हूं 'ओएसएक्स – johnboiles

+0

पर जीएसड प्राप्त करने के लिए' ब्रू इंस्टॉल gnu-sed' का उपयोग करें या ओएसएक्स पर मैकपॉर्ट्स पसंद करते हैं तो 'पोर्ट इंस्टॉल कोर्यूटिल' का उपयोग करें। –

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