2010-11-22 13 views
5

मैं प्रोजेक्ट "मायप्रोजेक्ट" के लिए अपनी मशीन पर गिट का आनंद उठा रहा हूं। MyProject वास्तव में एक बड़े सहयोगी अनुसंधान प्रयास "WholeThing" का हिस्सा है। WholeThing में myProject और अन्य प्रोजेक्ट्स के बीच वर्चुअल रूप से कोई ओवरलैप नहीं है।पथों को फिर से लिखते समय स्थानीय रिट रिपोजिटरी में स्थानीय गिट रिपॉजिटरी को माइग्रेट करना

अब, बिग बॉस ने सभी विकास को केंद्रीय गिट भंडार (दस्तावेज़ीकरण और बैकअप के लिए) पर रखने का निर्णय लिया है। अब तक मुझे समझ में आता है।

मान लें कि मुझे केंद्रीय भंडार में कोई विशेषाधिकार प्राप्त पहुंच नहीं है।

समस्या है, MyProject WholeThing की एक उप-निर्देशिका में नक्शे कि, यानी

local repo: 
MyProject -| 
      |- .git 
      | 
      |- dirs 


remote repo: 
WholeThing -| 
      |- .git 
      | 
      |- Area1 
      | 
      |- Area2 
       |------ MyProject 
       |------ DudesProject 

मैं कैसे केंद्रीय भंडार पर उचित उप निर्देशिका में अपने स्थानीय भंडार मिलता है, जबकि इतिहास और शाखाओं संरक्षण ?

मैं (मुझे लगता है;) दूरस्थ शाखाओं और सामानों को समझता है, लेकिन मैंने अभी तक माइक्रोजेक्ट की फ़ाइल के पथ को "स्थानीयकरण/क्षेत्र 2" के साथ अपने स्थानीय भंडार में फ़ाइलों को स्थानांतरित करने के लिए एक पूर्ववत करने का तरीका नहीं निकाला है और एक धक्का देने से पहले प्रतिबद्ध करें। निश्चित रूप से एक और तरीका चाहिए?

मुझे व्हाउलटिंग क्लोन करने और सभी माइग्रेशन करने के बाद माईप्रोजेक्ट पर नेविगेट करने की भी कोई बात नहीं है ... इसलिए मैं submodules या ऐसे (और मेरे पास केंद्रीय भंडार में व्यवस्थापकीय पहुंच नहीं है) ।

किसी भी विचार का स्वागत है!

चीयर्स, जोस

उत्तर

3

अब तक के उत्तरों के लिए धन्यवाद ... मुझे Google पर अलग-अलग प्रश्न बनाने के लिए तैयार किया गया है।

उत्तर वास्तव में मैन पेज में लिखा गया है, आपको बस बहुत अंत तक पढ़ने की जरूरत है।

समाधान git filter-branch के साथ इतिहास को फिर से लिखना और ऐसा करने के दौरान प्रत्येक फ़ाइल के पथ को फिर से लिखना है। पथ को पुनर्लेखन सिद्धांत में --tree-filter (मुझे लगता है), या --index-filter के साथ किया जा सकता है, जो बहुत तेज़ है।

नीचे कोड स्निपेट मैन पेज git help filter-branch से लगभग वर्बैटिम लेता है, जो मेरे उदाहरण में निर्देशिकाओं को प्रतिबिंबित करने के लिए संपादित किया गया है। यह शामिल फ़ाइल के पथनामों के लिए प्रत्येक प्रतिबद्धता के लिए पूछता है, उन्हें "होलथिंग/एरिया 2/मायप्रोजेक्ट /" उपसर्ग करने के लिए फिर से लिखता है और काम करता है।

git filter-branch --index-filter \ 
    'git ls-files -s | sed "s-\t-&WholeThing/Area2/MyProject/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 

अगला (उम्मीदवार सरल) चरण रिमोट रिपोजिटरी जोड़ने और इसे धक्का देना है।

चीयर्स & धन्यवाद!

0

आदर्श रूप में आप Wholething/Area2 के तहत अपने स्वयं के उप परियोजना MyProject.git चाहिए।

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

सामान करने का उचित तरीका प्रति परियोजना एक गिट पेड़ होना है और इसलिए, WholThing के तहत कोई भी नहीं है। जब आप रिमोट शाखा जोड़ रहे हों तो उचित तरीके से "होलथिंग/एरिया 2" यूआरएल में स्वाभाविक प्रतीत होता है।

1

हाँ अगले कदम अच्छा और सरल

git remote add other [path/to/repo] 
git fetch other 
git checkout -b other-master other/master 
git checkout master 
git merge other-master 

है और आप

जाना अच्छा होना चाहिए
संबंधित मुद्दे