2012-03-21 9 views
13

मैं जीसीसी गिट दर्पण का उपयोग करने की कोशिश कर रहा हूं, here दस्तावेज।"काम कर रहे पेड़ इतिहास से अपस्ट्रीम एसवीएन जानकारी निर्धारित करने में असमर्थ"

git clone git://gcc.gnu.org/git/gcc.git 

जोड़ा गया Git-svn सामान:

git svn init -Ttrunk --prefix=origin/ svn+ssh://gcc.gnu.org/svn/gcc 

और फिर git svn rebase और git svn dcommit आदि सब अच्छी तरह से काम किया

कुछ समय पहले, मैं Git भंडार क्लोन।

कुछ महीने बाद, मैं स्थानीय Git शाखाओं पर विभिन्न विकास कार्य किया है, और मैं SVN अपस्ट्रीम के अधिक परिवर्तन प्रतिबद्ध करने के लिए आए हैं:

$ git rebase 
: Git miror से

  1. अद्यतन

  2. सुनिश्चित करें मैं SVN से पूर्ण नवीनतम है, लेकिन यह काम नहीं करता है:

    $ git svn rebase -v 
    Unable to determine upstream SVN information from working tree history 
    

किसी भी तरह से मैंने मेटा डेटा तोड़ दिया है! साथ ही ऊपर, मुझे लगता है कि मैंने गलती से कुछ बिंदु पर git svn fetch किया था, लेकिन यह हानिकारक नहीं होना चाहिए, क्या यह चाहिए?

$ git branch svntrunk remotes/origin/trunk 
$ git checkout svntrunk 
$ git svn rebase 
Unable to determine upstream SVN information from working tree history 

एक वेब खोज पता चलता है कि शाखा इतिहास किसी भी तरह SVN से अलग है, लेकिन मैं git log देख लिया है और हर प्रतिबद्ध एक है:

तो, मैं दूरस्थ Git दर्पण से एक ताजा शाखा बनाने की कोशिश की संबंधित git-svn-id, जो कि इसे अस्वीकार करने लगता है, नहीं?

तो, मैंने गिट से एक ताजा क्लोन की कोशिश की: //gcc.gnu.org/git/gcc.git, और उस भंडार में git svn rebase ठीक काम करता है। दो रिपो, दोनों में एक ही स्रोत से git rebase दोनों कैसे हो सकते हैं, अलग इतिहास है? संभवतः वे नहीं कर सकते हैं, और अंतर स्थानीय मेटा-डेटा में है?

अब, मैं रेपो कि मैं एक और रेपो के लिए पैच निर्यात हार Git-svn पहली जगह में होने की बात प्रतिबद्ध करने के लिए (हालांकि मैं कर सकता) में काम कर रहा है, और कचरा नहीं करना चाहती। तो, मैं इसे कैसे सुधार सकता हूं?

उत्तर

12

आपको इसे भ्रष्टाचार के साथ करने में सक्षम होना चाहिए। ग्राफ्टिंग को विरासत भंडार लाने के लिए उपयोग करने के लिए डिज़ाइन किया गया है मेरी समझ है। यह आपको मैन्युअल रूप से देता है कि कुछ रेफरी में एक सामान्य माता-पिता है।

जैसा कि टिप्पणियों में बताया गया है, वहां एक आसान समाधान हो सकता है। अगर यह सब कुछ विफल रहा तो यह काम करेगा।

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

unrelated ancestry

मैं काम में एक घटना है जहाँ हम कुछ बजाय एक फाइल सिस्टम की नकल करना था एक SVN नकल की है, तो अपनी शाखा नामों में से कुछ के लिए किया था उस के बारे में बताओ। उम्मीद है कि यह सब कुछ समझ में आता है। बहुत भाग्यशाली है कि मैं बस इन सभी छवियों और कहानी के लिए होता है। कितनी संभावनाएं हैं!? शायद बहुत अच्छा, गिट-एसवीएन आसानी से उलझन में है।

naming branches

copied_from शाखा है वे कहाँ से कॉपी किया गया। Graft_ref वह है जहां यह मुलाकात की। उन्होंने फाइलों का एक गुच्छा जोड़ा, गुणों को बदल दिया, और फिर कुछ फाइलों को बदल दिया। यह एक गड़बड़ का थोड़ा सा था।

सामान्य विचार मूल स्रोत की अनुक्रमणिका प्राप्त करना है, लेकिन संशोधनों से मेल खाने के लिए फ़ाइल सामग्री। तो हम रेफरी शाखा में शुरू करते हैं, फिर सूचकांक प्राप्त करने के लिए मिश्रित रीसेट करें।

$ git checkout graft_ref 
$ git checkout -b graft_parent 
$ git reset --mixed copied_from 

reset mixed

आप जब यह टूट गया था, तो आप इस चरण के बारे में चिंता करने की ज़रूरत नहीं होना चाहिए दो शाखाओं के बीच परिवर्तन नहीं किया है।

$ git commit -a -m "svn_branch changes made on svn_trunk filesystem copy" 

अब हमें वास्तविक भ्रष्टाचार करने की आवश्यकता है। मैंने यहां पठनीयता के लिए हैश को छीन लिया।

$ git log -1 --pretty=format:%H graft_ref 
631d3c84e35de98236c3d36c08d14ec92f9c62ae 
$ git log -1 --pretty=format:%H graft_parent 
96a4e87b554e0030035d35ca3aac23e9d71962af 
$ echo "631d3... 96a4e8..." > .git/info/grafts 

grafted

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

$ git checkout svn_branch/master 
$ git checkout -b consolidate_changes 

consolidated

$ git rebase master 

rebase

आप जहां कभी इन परिवर्तनों को पुश करने के लिए सक्षम होना चाहिए। हालांकि गिफ्ट को गिट द्वारा ट्रैक नहीं किया जाता है, इसलिए तैयार की गई शाखा (svn_branch/मास्टर और दोस्तों) फिर से टूट जाएंगी। यह प्रभावी रूप से एक मृत पेड़ है जब तक आप फिर से भ्रष्टाचार नहीं करते हैं। गिट-एसवीएन के लिए यह कोई मुद्दा नहीं है क्योंकि आप केवल बदलाव करते हैं और फिर एक स्वच्छ प्रति के रूप में स्रोत को फिर से खींचते हैं।

+0

+1, बहुत अच्छा जवाब (आपके ब्लॉग पोस्ट में से एक, शायद ...?)। मुझे यकीन नहीं है कि यह सीधे संबोधित होने वाली समस्या पर लागू होता है (इसके लिए, एक सरल समाधान सबसे उपयुक्त हो सकता है), लेकिन असंगत स्थिति में रिपॉजिटरीज़ में परिवर्तनों को ग्राफ्ट करने के लिए एक लागू और उपयोग करने योग्य प्रक्रिया के रूप में, मैं पूरी तरह से स्वीकृति देता हूं। :) – MrGomez

+1

@MrGomez मुझे आशा है कि एक आसान समाधान होगा। :)) अन्य सभी विफल हो जाते हैं, मैं काफी हद तक निश्चित हूं कि यह काम करेगा हालांकि। –

+0

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

3

यह एक काफी आम परिदृश्य है। मैं भी अपने पुराने, एसवीएन समर्थित बैक डेटा स्टोर के खिलाफ अपने नए गिट भंडारों को सिंक्रनाइज़ करने का प्रयास करते समय इसमें भाग गया हूं।

रहस्य गिट में कार्यरत मास्टर शाखा के साथ एसवीएन को बनाए रखने का रहस्य है। ऐसा करने के लिए सामान्य आदेश हैं, जैसा कि आपने बताया है, git svn rebase (अपने परिवर्तनों को खोलने और एसवीएन के साथ वापस सिंक्रनाइज़ करने के लिए) और git reset --hard (पिछली संशोधन में हार्ड रोलबैक करने के लिए जब आपकी आंतरिक अनुक्रमणिका एक असंगत स्थिति में है)। इस प्रक्रिया को मेरे लिए रूट करने के लिए खोज करने का एक बड़ा सौदा हुआ। (इससे पहले कि आप इनमें से किसी प्रदर्शन एक बैकअप प्रतिलिपि रखना।)

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

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

+0

धन्यवाद, मैंने यह प्रश्न देखा, लेकिन जैसा कि मेरे पास गिट संस्करण 1.7.0.4 है, यह मेरी समस्या का समाधान नहीं करता है। तो, आपको लगता है कि अगर मैं किसी शाखा को वापस किसी तरह से रोल करता हूं तो यह जादुई रूप से फिर से काम करना शुरू कर सकता है? – ams

+0

@ams यह मेरे लिए किया, कम से कम! मुझे अपने स्वयं के भंडार के लिए यह समाधान मिलने से पहले मुझे लगभग तीन दिनों के फलहीन Google प्रश्नों का सामना करना पड़ा। मेरे मामले में, मैं गिट त्रि-दिशात्मक रूप से परिवर्तन कर रहा था: अपनी कामकाजी फाइलों के भीतर, डाउनस्ट्रीम रिपोजिटरी से और एसवीएन में। यह एक बिट पसंद नहीं आया। – MrGomez

+0

@ams यह भी देखें, इन सुझावों: http://stackoverflow.com/questions/3095611/git-svn-dcommit-error-unable-to-determine-upstream-svn-information – MrGomez

2

काम करने वाली सबसे आसान चीज git svn fetch चलाने के लिए है। यदि आप svn पर मौजूदा गिट रेपो को फिर से संलग्न करते हैं, तो आपको git svn rebase पर कोई अच्छा कारण नहीं मिलेगा। अंतर्निहित समस्या यह है कि गिट-एसवीएन आपके रेपो की स्थिति के बारे में धारणा बनाता है जो हमेशा एक स्वच्छ svn क्लोन से शुरू नहीं हुआ है, जो हमेशा नहीं पकड़ता है।

अगला विकल्प बैकअप मास्टर git branch master-bkp पर है। और फिर git reset --hard <way-back> चलाएं। फिर git svn rebase चलाएं।

केवल अगर आप एक गिट रेपो पर काम कर रहे हैं कि आप किसी भी तरह से सामान्य तरीके से svn पर संलग्न नहीं हो सकते हैं, तो आप ग्राफ्टिंग का प्रयास कर सकते हैं। ग्राफ्टिंग चालाक और जटिल है, लेकिन संभव है। सही करना, स्क्रू करना आसान है, और बहुत समय लेने वाला भी मुश्किल है। पहले विकल्प के रूप में अनुशंसित नहीं है।

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