2012-07-02 21 views
5

मैं दो खजाने है:दो खजाने (मूल परियोजना और परिवर्तित परियोजना इतिहास के बिना) मर्ज

  • Gephi (बड़ा ओपन सोर्स प्रोजेक्ट) GitHub पर होस्ट
  • मेरी कंपनी के परियोजना gephi के आधार पर

7 महीने पहले, जब हमारी परियोजना शुरू हुई, किसी ने गिथब पर गेफी परियोजना का एक स्नैपशॉट लिया और इसे कॉर्पोरेट svn => इतिहास इतिहास हानि

पर निर्णय लिया भंडार git और मूल परियोजना

मैं अब Git भंडार Git-svn

मेरी फाइलों के साथ SVN से चले गए समय से परे परिवर्तन इतिहास नहीं है के साथ परिवर्तन मर्ज करने के लिए हमारी परियोजना के लिए कदम जब हमारी परियोजना

शुरू कर दिया क्या मैं अपने भंडार की प्रारंभिक स्थिति को मूल भंडार की स्थिति में मैप कर सकता हूं? दूसरे शब्दों में, मैं विशिष्ट संशोधन से मूल भंडार में हमारे परिवर्तनों को लागू करना शुरू करना चाहता हूं।

अद्यतन:

आज मैं एक और बाधा पाया। पहले स्कीमा:

enter image description here

  • लाल शाखा मूल परियोजना

  • <alpha1> और <alpha2> मुख्य परियोजना के लिए प्लग-इन के प्रतिबद्ध हैं (<E' E'' E'''> में प्रतिबद्ध कोड से संबंधित नहीं)

  • में है <E'> <E''> <E'''> मुख्य परियोजना (लाल) भंडार से कोड जोड़ा गया था <E> (प्रत्येक प्रतिबद्धता सी में सीए <E> से परियोजना का एक तिहाई)

मैं एक में लाल और नीले रंग खजाने दिलवाया है। दूसरी स्कीमा पर मुझे वांछित राज्य है। क्या इसे करना संभव है? (उदाहरण के लिए <E' E'' E''> से) मार्क के रूप में प्रतिबद्ध बनाने के सिर्फ एक प्रतिबद्ध (<E'> और फिर एक शाखाओं <ABCD> और <alpha1 alpha2> से विलय)

आपकी प्रतिक्रिया के लिए जुलिएन धन्यवाद। यह बहुत उपयोगी लगता है।

उत्तर

5

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

तो मुझे लगता है कि आपके पास दो स्वतंत्र भंडार हैं।मूल परियोजना (Gephi):

A---B---C---D---E 
       ^HEAD of Gephi 

और अपनी परियोजना, जिनकी पहली संशोधन मूल परियोजना के अंतिम संशोधन के समान लगता है:

E'---V---W---Y---...---Z 
        ^HEAD of your project 

(संभवतः कुछ शाखाओं के साथ है, लेकिन यह वास्तव में बात नहीं करता है । यहाँ)

आप करना चाहते हैं क्या (यदि मैं सही ढंग से समझ में आ) है:

A---B---C---D---E---V---W---Y---...---Z 

आप निम्न कोशिश कर सकते हैं। फिर, इसे अपने आप, अलग-अलग काम करने वाले पेड़ पर करें, और यह सुनिश्चित करें कि किसी भी केंद्रीय भंडार को इसे धक्का देने से पहले सब कुछ ठीक है!

अपने खुद के काम कर पेड़ की निर्देशिका में, सिर और मूल Gephi भंडार की वस्तुओं लाने जबकि:

git fetch /path/to/original/gephi 

आप Gephi भंडार क्लोन नहीं है, तो आप के रूप में अच्छी GitHub निर्दिष्ट कर सकता है एक स्थानीय फाइल सिस्टम पथ के बजाय यूआरएल।

यह आपके वर्तमान कार्यशील पेड़ में निम्नलिखित स्थिति में परिणाम होगा:

A---B---C---D---E 
       ^FETCH_HEAD 

E'---V---W---Y---...---Z 
        ^HEAD 

हम एक बहुत नहीं बदला है। वर्तमान में, दोनों सिर एक दूसरे से शांतिपूर्वक और पूरी तरह से स्वतंत्र रूप से सह-अस्तित्व में हैं, लेकिन अब आपके पास दोनों भंडारों से वस्तुओं तक पहुंच है और उन्हें गठबंधन करने का प्रयास कर सकते हैं।

अब हम ई त्यागने के लिए '(यह ई करने के लिए समान होना चाहिए), और बदले ई अपनी परियोजना के पहले प्रतिबद्ध के माता पिता, जो वी ऐसा करने के लिए है बनाना चाहते हैं, तो आप उपयोग कर सकते हैं git filter-branch:

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat' 

क्रमशः वी और ई के प्रतिबद्ध हैंश द्वारा <V> और <E> बदलें। उनको ढूंढने के लिए, आप अपने प्रोजेक्ट के कामों की जांच के लिए git log कर सकते हैं और, क्योंकि हमने उन्हें Gephi के कामों की जांच के लिए git log FETCH_HEAD लाया है।

यह प्रभावी ढंग से सीधे ई

को

वी कनेक्ट करेगा यह और भी काम करना चाहिए अगर यह मूल Gephi भंडार का पता चला है कि सिर (यानी नवीनतम प्रतिबद्ध) नहीं है कि तुम क्या, अर्थ पर अपनी परियोजना आधारित कि गेपी में नए काम रहे हैं कि आपने (अभी तक?) का ख्याल रखा है। बस सुनिश्चित करें कि <E> को उस प्रतिबद्धता के हैश के साथ प्रतिस्थापित करें, जिस पर आपने पर अपने परिवर्तनों पर आधारित है।

इसके विपरीत, सुनिश्चित करें कि के के हैश के साथ आप पहले बनाते हैं। हो सकता है कि आपके भंडार में ई के समान ई शामिल न हो, लेकिन पहले ही प्रतिबद्धता में पहले से मूल में परिवर्तन शामिल हैं। फिर यह पहला प्रतिबद्ध हैश आपके <V> होगा, इसके बाद इसके बाद।

संक्षेप में दोनों पिछले पैराग्राफ: उपरोक्त आदेश भी अपनी स्थिति, की तरह लग रहा है, तो उदाहरण के लिए काम करना चाहिए, इस:

A---B---C---D---E---F---G---H---I 
       ^   ^FETCH_HEAD 
       point where your project branched off 

V---W---Y---...---Z 
^    ^HEAD 
first change based on E 

बस हैश कि इस संदर्भ में समझ बनाने के लिए प्रतिबद्ध का उपयोग सुनिश्चित करें।

+0

मैंने अभी इसका परीक्षण किया है, और ऐसा लगता है (इसलिए मैंने शीर्ष पर अपनी चेतावनी अपडेट की है)। मैं अभी भी आपको एक डिस्पोजेबल काम करने वाले पेड़ पर और पूर्ण बैकअप बनाने की कोशिश करने की सलाह देता हूं। 'फ़िल्टर-शाखा 'कथन गलत है, या हैश को मिलाकर आसान है! –

+0

यदि स्थानीय प्रोजेक्ट में कई शाखाएं हैं, या यदि इतिहास में कोई विलय हो, तो 'गिट रीबेस' सही टूल नहीं है क्योंकि यह इतिहास को रेखांकित करेगा। इसके बजाए 'फ़िल्टर-शाखा' का प्रयोग करें। –

+0

धन्यवाद। यही वह था जो मैंने मूल रूप से किया था, लेकिन मैंने सोचा कि रिबेस में आसान वाक्यविन्यास था। मैंने अपने परिवर्तनों को वापस कर दिया और अब यह केवल फ़िल्टर-शाखा का उल्लेख करता है। –

1

ऐसा लगता है कि आप grafts (या संभवतः replacements) की जांच के लिए चाहते हो सकता है - इन तरीकों filter-branch और उस में rebase से अलग बल्कि वे इतिहास को फिर से लिखने की तुलना में, भंडार के दृश्य स्थिति बदलने में मेटा डेटा जोड़ने के लिए वास्तव में प्रभाव बदलाव। यह तब उपयोगी होता है जब आपके पास मौजूदा शाखाओं का उपयोग करने वाले लोग होते हैं, क्योंकि इससे उनके अंतर्गत इतिहास बदलना टाल जाता है।

अपने मामले में, आप E' के लिए एक भ्रष्टाचार जोड़ना चाहते हैं, E को अतिरिक्त माता-पिता के रूप में दें।

+0

मैं ग्राफ्ट्स पर 'गिट प्रतिस्थापन' की अनुशंसा करता हूं - प्रतिस्थापन संदर्भ हैं, इसलिए उन्हें रिपॉजिटरीज़ (उपयुक्त रेफस्पेक के साथ) के बीच समन्वयित किया जा सकता है। –

+0

हां, यह कई मामलों में सच है। हालांकि, गिट रिपोजिटरी की तरह समस्या का वर्णन अभी शुरू हुआ है ("अब मैंने अपनी परियोजना को स्थानांतरित करने का फैसला किया है [...]/अब मेरे पास गिट रिपोजिटरी है"), और एक ताजा भंडार के साथ, मैं अतिरिक्त मेटाडेटा के बजाय वास्तविक पुनः लिखना पसंद करता हूं जो समय के अंत तक रुक जाएगा। –