2009-07-15 11 views
25

मैं Git-svn निम्नलिखित कार्यप्रवाह अबGit SVN कार्यप्रवाह - सुविधा शाखाओं और

git clone <SVN TRUNK URL> #done once 

बाद में जब मैं एक सुविधा पर

git branch featureZ 
git checkout featureZ 
#make edits for featureZ 
git commit 

git checkout master 
git svn rebase # fetch changes from server 

git checkout featureZ #go back to branch 
#git merge master 
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below) 

#make edits for featureZ 
git commit #featureZ completed 

git checkout master 
git merge featureZ #getting featureZ onto master. Prepare to send to SVN 

git svn dcommit #push featureZ back to SVN 

अब टिप्पणी के कुछ बिन्दुओं काम के साथ उपयोग कर रहा हूँ जब मैं विलय मास्टर पर फीचर की गिट मर्ज करें, फीचर जेड शाखा में सभी व्यक्ति काम करते हैं जो मेरे साथ ठीक है।

प्रतिबद्ध संदेश को "फीचरजेड के साथ विलय" के रूप में बदल दिया गया है। इसे merge fmt msg के साथ तय किया जा सकता है।

अब मेरा प्रश्न है क्या इस वर्कफ़्लो के साथ गलत हो सकता है या इसकी देखभाल करने की आवश्यकता है। मैंने git-svn manual में पढ़ा है कि गिट svn के साथ काम करते समय विलय नहीं किया जाना चाहिए। क्या मैं अपने वर्कफ़्लो में क्या कर रहा हूं वह यह है कि वे किस बात का जिक्र कर रहे हैं? यदि हां, तो किस तरह की समस्या का कारण होगा? एक बात यह है कि मैं कुछ ऐसा नहीं करना चाहता जो एसवीएन मेनलाइन के साथ गड़बड़ करे।

+5

बीटीडब्ल्यू, आप 'गिट शाखा के बजाय 'गिट चेकआउट -बी' का उपयोग कर सकते हैं ..; गिट चेकआउट'। 'चेकआउट 'कमांड के लिए' co' उपनाम का उपयोग करना भी आम है। – jfs

उत्तर

26

एसवीएन गैर-रैखिक इतिहास को संभाल नहीं सकता है (इसमें बस इसका कोई संकेत नहीं है)। तो आप जो करना चाहते हैं वह एक विलय के बजाय एक विद्रोह है क्योंकि यह एसवीएन के साथ रैखिक इतिहास को संरक्षित करता है (यह गिट-एसवीएन मैन पेज here पर इंगित किया गया है।

विस्तारित करने के लिए, रैखिक इतिहास छोटे होते हैं। वे एक में जाते हैं सीधी रेखा (ए से बी से सी से डी)। जबकि गैर-रैखिक इतिहास (ए से बी से सी, बी से डी तक सी + डी से ई तक जा सकते हैं - दूसरे शब्दों में, वे शाखाओं में अंकुरित होते हैं)

रीबेजिंग आपको एक रैखिक इतिहास देगा। याद रखें कि रीबेज आपके निजी स्थानीय-केवल शाखाओं से किया जाना चाहिए। उदाहरण के लिए, यदि आपके पास 2 शाखाएं हैं: मास्टर और प्रयोगात्मक। आप प्रायोगिक जांच करेंगे और 'गिट रीबेस मास्टर' अधिमानतः करेंगे -आई ध्वज के साथ। इसे दूसरी तरफ करने से अवांछित साइड इफेक्ट्स हो सकते हैं।

यह तब आप मास्टरआउट चेकआउट करते हैं और प्रयोगात्मक शाखा के परिवर्तनों में विलय करते हैं। आपका इतिहास रैखिक रहना चाहिए।

+0

क्या आप समझा सकते हैं कि गैर-रैखिक इतिहास क्या है? एक और बात यह है कि मैं नहीं चाहता (देखभाल) कि एसवीएन को यह जानने की जरूरत है कि मेरे पास स्थानीय शाखाएं थीं जिन्हें मैंने विलय कर दिया था। आप कहां सुझाव देते हैं कि मेरे वर्कफ़्लो में रीबेस की आवश्यकता है? गिट rebase सुविधाZ? – Pradeep

+0

मैंने अपने उत्तर पर विस्तार से बताया। आशा करता हूँ की ये काम करेगा। :) –

+0

स्पष्टीकरण के लिए धन्यवाद। मैं समझ गया कि गैर-रैखिक इतिहास क्या है, हालांकि मैं अभी तक केवल रैखिक इतिहास बना रहा हूं (खुद को ब्रांच करने के लिए नया)। तो अब गैर-रैखिक इतिहास के लिए तैयार होने के लिए मैंने फीचर शाखा से मास्टर से परिवर्तन खींचने के लिए फीचर शाखा से गिट रिबेस मास्टर का उपयोग शुरू किया। यह ठीक काम करता है। इसने मास्टर से मेरी शाखा में बदलावों को खींच लिया और मेरे काम को इसके ऊपर फिर से चलाया। तो शाखा से "गिट मर्ज मास्टर" के बजाय "गिट रीबेस मास्टर" का उपयोग करना एकमात्र परिवर्तन है। मास्टर शाखा से अंतिम "गिट मर्ज फीचरज़" ठीक है तो? – Pradeep

4

आप इस मर्ज विकल्प पर गौर करना चाहिए:

git checkout master 
git merge --squash featureZ 

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

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

+0

स्क्वाश शाखा इतिहास को नष्ट कर देते हैं और इस प्रकार मैं उन्हें अनुशंसा नहीं कर सकता। अगर मैं आपको वोट दे सकता हूं तो मैं (और मैं करूंगा)। –

+1

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

+0

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

2

नकली-कोड-बंदर-रशीद द्वारा दिया गया उत्तर सही है। यह एक उत्तर और एक सरलीकरण के अधिक से कम है।

आप किसी भी गिट शाखा से svn rebase/dcommit कर सकते हैं। मास्टर का एकमात्र उपयोग यह होगा कि यदि आपके पास फीचरज़ से परिवर्तनों के साथ विलय करने के लिए आवश्यक अन्य स्थानीय परिवर्तन हैं।

git branch featureZ 
git checkout featureZ 
#bunch of changes 
git commit 
git svn rebase 
# solve any conflicts 
git svn dcommit 

आप या तो इसे git svn rebase या git merge featuresZ

0

के बजाय Git-SVN, आप SubGit उपयोग कर सकते हैं कर सकते हैं एक साफ मास्टर तो रखना चाहते हैं। यह एक सर्वर-साइड टूल है जो स्वचालित रूप से सबवर्जन और गिट रिपॉजिटरीज को सिंक्रनाइज़ करता है।

आप किसी भी गिट वर्कफ़्लो और किसी भी गिट क्लाइंट का उपयोग कर सकते हैं, कोई अतिरिक्त क्लाइंट टूल आवश्यक नहीं है। पूरी तरह

  1. पुश सुविधा शाखा:

    अपने परिदृश्य को ध्यान में रखते:

    git branch featureZ 
    git checkout featureZ 
    # make edits for featureZ 
    git commit 
    git checkout master 
    

    इस प्रकार आप आगे बढ़ सकते हैं।

    git merge featureZ 
    git push origin refs/heads/* 
    
  2. मास्टर/ट्रंक के शीर्ष पर एक फीचर शाखा रीबेज करें।

    git rebase featureZ 
    git push 
    
  3. स्क्वाश एक सुविधा शाखा से काम करता है।

    git merge --squash featureZ 
    git commit 
    git push 
    

जैसे ही आप परिवर्तन धक्का के रूप में, SubGit हुक सबवर्सन संशोधन में अपने परिवर्तन अनुवाद करते हैं।

कुछ और जानकारी:

  • कई मायनों में SubGit Git-SVN की तुलना में अधिक बेहतर है - बेहतर मर्ज ट्रैकिंग अनुवाद, EOLs & माइम-प्रकार सहायता आदि
  • SubGit सबवर्सन करने के लिए स्थानीय उपयोग की जरूरत है भंडार (यह कस्टम हुक का उपयोग करता है);
  • सबगिट कुछ वाणिज्यिक विकल्पों (ओपन-सोर्स और अकादमिक परियोजनाओं, छोटी टीमों) के साथ एक वाणिज्यिक उत्पाद है।
संबंधित मुद्दे