2010-11-12 9 views
17

मेरा रेपो एसवीएन है, और मैं गिट के साथ सभी विकास करता हूं। हम एक मानक लेआउट है, और मुझे git svn init -s <url to repo>गिट-एसवीएन कैसे जानता है कि कौन सी शाखा को डॉकिट करना है?

साथ अपने स्थानीय रेपो प्रारंभ यहाँ शाखाओं के साथ काम करने के लिए मेरे कार्यप्रवाह है:

# creates a new branch remotely 
git svn branch new-branch-name 

# switches to a branch or trunk locally 
git reset --hard name-of-branch 
git reset --hard trunk 

# merge changes from trunk into a branch 
git reset —hard name-of-branch 
git merge trunk 
git svn dcommit 

कि पिछले आदेश ऊपर शाखा का नाम के- शाखा में परिवर्तन हो जाएंगे। मेरा सवाल है, गिट यह कैसे जानता है? जब मैं reset --hard foo गिट करता हूं, तो वास्तव में क्या होता है?

यह गिट के बारे में एक सामान्य प्रश्न पर आ सकता है। हर बार जब मैं एक उत्तर शोध करने की कोशिश करता हूं तो मुझे भ्रमित हो जाता है कि क्या svn एकीकरण एक विशेष मामला है या नहीं।

उत्तर

11

git-svn सक्रिय एसवीएन शाखाओं (refs/remotes/... शाखाओं के अनुरूप एसवीएन में शाखाओं के अनुरूप) पूर्वजों के लिए प्रतिबद्ध पेड़ को देखेगा। इसके बाद यह उन लोगों को कम कर देगा।

ध्यान दें कि आपको विलय नहीं करना चाहिए और फिर डॉकिट करना चाहिए - एसवीएन और गिट का ब्रांचिंग मॉडल मेल नहीं खाता है, और इस तरह की चीज आपके एसवीएन इतिहास को फ्यूबर कर सकती है। जब आप शाखा में हों तो आपको git rebase trunk चाहिए। (वैकल्पिक रूप से, git svn rebase।)

साथ ही, ध्यान रखें कि आप जिस शाखा को चेकेज से पहले चेक आउट करते हैं वह स्थानीय शाखा होनी चाहिए। यदि ऐसा नहीं है, तो आप git checkout -b local-branch-to-create remote-branch के साथ एक बना सकते हैं। फिर git rebase trunk

यदि आप उन सभी कामों को स्क्वैश करना चाहते हैं जो एक में छूट दिए गए हैं, तो रीबेज के बाद ऐसा करें: git reset --soft trunk && git commit

एक बार जब आप ट्रंक के शीर्ष पर रहते हैं, तो बस git svn dcommit उन्हें एसवीएन सर्वर पर धक्का देने के लिए खुश हैं।

+0

[1] "गिट-एसवीएन पूर्ववर्ती एसवीएन शाखाओं के अनुरूप पूर्वजों के लिए प्रतिबद्ध पेड़ को देखेगा। फिर यह उन लोगों के लिए कमजोर होगा।" - कभी-कभी यह गलत लगता है - क्या यह स्पष्ट रूप से इसे निर्दिष्ट करने का कोई तरीका है? [2] "इस तरह की चीज आपके एसवीएन इतिहास को फ्यूबर कर सकती है" - तो, ​​इतिहास एकजुट होगा, लेकिन कोड फाइलों का विलय ठीक होना चाहिए, हां? –

+0

हम्म, मैन पेज का कहना है कि '--commit-url' का उपयोग केवल परिवहन को स्विच करने के लिए किया जाना चाहिए, और" किसी भी अन्य उद्देश्य (पूछना नहीं) के लिए इस विकल्प का उपयोग करना बहुत दृढ़ता से निराश होता है। " –

+0

यदि आप प्रतिबद्ध करने के लिए एक विशिष्ट शाखा निर्दिष्ट करना चाहते हैं, तो बस अपने गिट रेपो में संबंधित रिमोट शाखा के शीर्ष पर अपनी फीचर शाखा को रीबेस करें। – cdhowie

2

क्या यह स्थानीय शाखा बनाने और रिमोट svn शाखा को ट्रैक करने जितना आसान नहीं है? जब आप git svn init --stdlayout url-of-svn-repo करते हैं, तो गिट पूरे svn repo को नीचे लाता है, इसे संपीड़ित करता है ताकि यह गिट के साथ संचालित हो।

उसके बाद ऐसा कुछ करने का तथ्य का मामला है:

git checkout -b mybranch -t remotes/mybranch 

आप एक स्थानीय शाखा एक दूरस्थ शाखा ट्रैकिंग है, तो git svn dcommit केवल पता लगाया दूरस्थ शाखा को धक्का।

+3

मैंने यह कोशिश की और 'git svn dcommit -n' अभी भी कहता है कि यह उस शाखा के बजाय ट्रंक करने के लिए काम करेगा जो मैं चाहता हूं –

+0

यह इतना आसान नहीं है:" गिट यह बताता है कि आपकी डॉक्यूमेंट्स किस शाखा को टिप की तलाश में जाती है आपके इतिहास में आपकी किसी भी सबवर्जन शाखाओं में से - आपके पास केवल एक होना चाहिए, और यह आपके वर्तमान शाखा इतिहास में एक गिट-एसवीएन-आईडी के साथ अंतिम होना चाहिए। " https://git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client#switching-active-branches-LPtGtkszIW – jgomo3

1

सरल तरीका है कि आप SVN ट्रंक में Git मास्टर dcommit के लिए, निम्न कमांड की कोशिश करना चाहते हैं तो:

git checkout master 
git rebase trunk 
git svn info # To verify that you're on the right branch 
git svn dcommit 

ही जब अन्य शाखा पर (जैसे 6.x)

git checkout 6.x 
git rebase 6.x # or git rebase remotes/6.x 
git svn info 
git svn dcommit 
संबंधित मुद्दे