2010-08-30 7 views
10

मुझे एक ट्रंक सेटअप मिला है जहां मेरा सभी उत्पादन कोड चला जाता है।एक जीआईटी-एसवीएन डीबग-> फीचर शाखा को ट्रंक में स्थानांतरित करने का सबसे अच्छा तरीका क्या है?

तब मेरे पास debug शाखा है (माता-पिता trunk है) जो मैं लॉगिंग, var डंप आदि जैसे डिबगिंग कोड जोड़ता हूं ... यह कभी भी उत्पादन में नहीं होना चाहिए। यह शाखा शायद ही कभी बदलती है।

अंत में मेरे पास feature शाखा है (माता-पिता debug) जहां मैं डिबगिंग के लाभों के साथ अपने सभी कोडिंग करता हूं। इस शाखा में लगातार काम करता है।

मैं सिर्फ यह जानना चाहता हूं कि feature कोड trunk पर ले जाने का कोई आसान तरीका है या नहीं। यह मैं वर्तमान में क्या कर रहा है:

  1. अन्य devs से master और git svn rebase परिवर्तन करने के लिए मेरी feature शाखा में सभी परिवर्तन हो
  2. स्विच। अन्य devs को
  3. rebasemaster शाखा पर मेरी feature शाखा (git rebase --onto master debug feature)
  4. merge सुविधा master को
  5. git svn dcommit परिवर्तन
  6. rebasedebug को master (git rebase master debug)
  7. हटाना feature शाखा
  8. एक बनानेसे नया शाखा।
+0

शायद मुझे इसे एक नया प्रश्न बनाना चाहिए, लेकिन क्या यह वास्तव में एक अच्छी प्रैक्टिस है जिसे आप अपनी शाखा में डीबगिंग कोड डालकर रनटाइम पर चालू/बंद कर सकते हैं? – Damien

+0

व्यक्तिगत रूप से मैं अपने कोड में #ifdebug स्टेटमेंट जोड़ने और उत्पादन में सामान भेजने को समाप्त करने का जोखिम उठाना नहीं चाहता हूं। मैंने पैच की धारणा के साथ भी खेला। डिबग पैच बनाना जो मैं विकास के दौरान आवेदन करता हूं और रिलीज के लिए तैयार होने पर इसे अन-पैच करता हूं, लेकिन इससे विवाद पैदा हो जाते हैं और पैच को अद्यतित रखने की कोशिश करना दर्द होता है। –

+0

@ डेमियन: व्यक्तिगत रूप से, मैं आपके साथ हूं। मुझे लगता है कि अधिक सेन समाधान रनटाइम पर डीबग सामान को सक्षम/अक्षम करने की अनुमति देना है (या * बहुत * कम से कम, संकलन समय पर)। –

उत्तर

1

मैं कहूंगा कि आपका कार्य प्रवाह बहुत इष्टतम है। मैं चेरी-पिकिंग को ओवरकिल मानता हूं (लेकिन यह काम करने की संख्या पर निर्भर करता है)।

आप क्या कर सकते हैं स्क्वैश सभी में एक काम करता है और चेरी-पिक/रीबेस बस इस पर।

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

+0

हाँ चेरी-पिक बहुत सारे काम की तरह दिखता है। इसके अलावा जब मैं ट्रंक में विलय करता हूं तो मैं एक स्क्वैश करता हूं इसलिए एसवीएन अंतिम प्रतिबद्धता को एक प्रतिबद्धता के रूप में देखता है। और मेरे पास इस पूरी चीज के लिए एक बैश स्क्रिप्ट है, बस यह नहीं पता था कि कोई आसान तरीका है क्योंकि मेरे पास प्रत्येक चरण में "रोक" है ताकि यह जांच सके कि कुछ भी गलत नहीं हुआ है, ठीक काम करता है बस इसे हर समय देखना होगा। –

+0

@ जेडी बस गिट रिटर्न वैल्यू की जांच करें और यदि कुछ विफल हो जाता है, तो बस बैश चलाएं। यह आपको सामान को ठीक करने के लिए एक इंटरैक्टिव प्रॉम्प्ट देगा और जब आप प्रॉम्प्ट से बाहर निकलेंगे, तो प्रक्रिया जारी रहेगी। –

+0

कोई बुरा विचार नहीं है, मैं इसे आज़मा दूंगा। –

0

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

शाखाएं अपडेट की जा सकती हैं यदि वे थोड़ी पुरानी हो जाएं।

हम ट्रंक में सीधे मामूली परिवर्तन जारी करते हैं, लेकिन अधिक बड़े बदलावों के लिए हम उन्हें एक रिलीज उम्मीदवार शाखा में इकट्ठा करते हैं जिसमें हम सभी प्रासंगिक शाखाओं को विलय करते हैं जिसमें लाइव रहने के लिए परिवर्तन होते हैं। इस नई शाखा को तैनात और परीक्षण किया जा सकता है यह देखने के लिए कि क्या परिवर्तन संयोजन कुछ भी तोड़ता है, इससे पहले कि अंततः ट्रंक पर वापस विलय हो जाता है और उत्पादन में जाता है।

यह विधि कई शाखाएं बनाती है, लेकिन चूंकि हम इन्हें हमारे मुद्दे ट्रैकिंग सिस्टम से संबंधित करते हैं, इसलिए उन्हें ट्रैक रखना आसान होता है। रिलीज में किसी भी बदलाव को शामिल करना या बहिष्कृत करना आसान है।

आशा है कि मदद करता है

+0

मेरा प्रश्न अधिक जीआईटी विशिष्ट था और मुझे लगता है कि आप इसे मेरे वर्तमान कार्य प्रवाह में शामिल करते हैं, लेकिन सादगी के लिए मैंने एक मूल उदाहरण का वर्णन किया। –

0

मुझे लगता है कि आप देख रहे हैं Git-चेरी पिकअप है। यह आपको बताए गए रीबेस नृत्य के बिना मास्टर पर फीचर से काम करने की अनुमति देता है।

चूंकि आप फीचर शाखा को हटाने जा रहे हैं, फिर भी आपको एक स्पष्ट विलय देखने की आवश्यकता नहीं है।

1

ठीक है, मैं एक पाखंडी कहूंगा और हर कोई मुझे वोट देगा, लेकिन चलो चलें। यदि आपने सीधे svn का उपयोग किया है, तो आपका वर्कफ़्लो बहुत आसान होगा।

--reintegrate feature of subversion के साथ सिंक में अपने ट्रंक और डीबग शाखा को बनाए रखना आसान है। अपनी फीचर शाखा को मर्ज करने के लिए, आप ट्रंक में फीचर शाखा के सभी संशोधनों को मर्ज करेंगे। आदेशों होगा कुछ की तरह:

cd debug_branch_workcopy 
svn merge --reintegrate http://server/project/trunk . 
svn commit 

ट्रंक करने के लिए करने के लिए सुविधा शाखा मर्ज करने के लिए:

svn log --stop-on-copy http://server/project/branches/feature123 #see the last revision listed 
cd trunk_workcopy 
svn merge -r{revision_above}:HEAD http://server/project/branches/feature123 . 
svn commit 

आप पिछले मर्ज आदेश कई बार चला सकते हैं

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

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

+0

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

0

आपका वर्कफ़्लो जटिल है क्योंकि आप जो करने का प्रयास कर रहे हैं वह जटिल है। कोई वीसीएस जो मुझे पता है, आपको कुछ बदलावों को आसानी से बनाए रखने देता है जिन्हें कभी विलय नहीं किया जाना चाहिए। यह गिट की शक्ति के बारे में बहुत कुछ कहता है कि आपका वर्कफ़्लो इससे कठिन नहीं है।

मुझे लगता है कि आपकी भाषा में कुछ प्रकार की सशर्त संकलन तंत्र (#IFDEF प्रीप्रोसेसर निर्देश आदि) हैं। यदि आप इन में अपना डिबगिंग कोड लपेटते हैं तो आपको बहुत कम घर्षण का अनुभव होगा।

+0

मैं PHP के साथ वेब विकास कर रहा हूं, इसलिए #ifdef दृष्टिकोण काम करेगा, बस मेरे मालिक से बात करनी होगी और देखें कि वह उड़ जाएगा या नहीं। –

1

यदि मैं आपको सही ढंग से समझता हूं, तो आप अपनी डीबग सुविधाओं को केवल अपनी (सुंदर स्थिर) डीबग शाखा में रखना चाहते हैं, लेकिन आपकी मास्टर शाखा में नहीं। इस प्रयास करें:

मास्टर

git checkout master 
git merge --no-commit debug 
git checkout master .  # undo all changes, get the files from master again 
git add .     # stage all files 
git commit 

में इस तरह डिबग के एक "नकली मर्ज" करते हैं, डिबग मास्टर में विलय कर दिया जाएगा, लेकिन मास्टर में आपकी फ़ाइलों में से कोई भी बदल गया है जाएगा।

अब आप डीबग के शीर्ष पर अपनी फीचर शाखाएं बना सकते हैं, और जब आप पूरा कर लेंगे तो उन्हें मास्टर में मर्ज करें। Git अब जानता है कि डिबग सुविधाओं मास्टर से निकाल दिया जाता:

git checkout debug 
git checkout -b new_feature # create a new feature branch 
# hack, hack, hack 
git commit 
git checkout master   # All works fine... 
git merge new_feature  # ...so merge into master. Debug code will be stripped here 

आप new_feature पर तेजी से अग्रेषित कर सकते हैं डिबग शाखा है और इस के बाद new_feature शाखा को हटा दें।

ध्यान दें कि जब भी आप डीबग शाखा बदलते हैं, तो आपको नकली विलय प्रक्रिया को फिर से करना होगा।

+0

डीबग शाखा काम कर रही है, यह फीचर शाखा से बदलावों को ले जा रही है जो दर्द है। मेरे पास ट्रंक से फंसे एक डीबग शाखा है और फिर डिबग शाखा से फंसे एक फीचर शाखा है। फिर मैं ऊपर दिए गए आदेशों का उपयोग करके फीचर कोड ले जाता हूं, बस यह देखने का प्रयास कर रहा हूं कि कोई आसान तरीका है या नहीं। –

+0

मैंने मास्टर कोड में फीचर कोड को मर्ज करने का एक उदाहरण जोड़ा है। क्या अब यह स्पष्ट है? –

+0

+1, यह जानने के लिए एक अच्छी तकनीक है। हालांकि, जैसे ही आप 'मास्टर' से नई सुविधाओं को मर्ज करने का प्रयास करते हैं, आपका डीबग कोड खो जाएगा। इसलिए, नई सुविधाओं को 'डीबग' में विलय करने के बाद, चेरी-पिक चुनें अपनी डीबग 'डीबग' में वापस आती है (यानी कम चेरी इस तरह से चुनती है)। यह भी: जब 'नकली मर्ज' करते समय, कृपया सुनिश्चित करें कि मर्जोमेट संदेश आपके टीम के साथी की सैनिटी के लिए इस तथ्य को दर्शाता है। – Nathan

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

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