2009-07-23 7 views
7

मैं एक सब्सक्रिप्शन रिपोजिटरी में एक सख्त चेक-इन नीति के साथ एक परियोजना पर काम कर रहा हूं जिसमें शामिल हैं: ट्रंक को हर प्रतिबद्धता की समीक्षा किसी अन्य डेवलपर द्वारा की जानी चाहिए और यह प्रतिबद्ध संदेश में उल्लिखित होना चाहिए।गिट-एसवीएन डॉकिट करने से पहले कुछ स्क्वैशिंग या संपादन करना?

गिट-एसवीएन के साथ काम करते समय मैं कई वृद्धिशील गिट चेक-इन्स बना रहा हूं जिनकी समीक्षा नहीं की जा रही है। उनके गिट प्रतिबद्ध संदेश इसे प्रतिबिंबित करते हैं।

गिट-एसवीएन का उपयोग करने का सबसे अच्छा तरीका क्या है लेकिन svn भंडार के नियमों का पालन करें? क्या मुझे बस स्क्वैश करना चाहिए एक ही svn प्रतिबद्ध में? क्या मैं समीक्षाकर्ता जानकारी के साथ प्रत्येक संशोधन के लिए प्रतिबद्ध संदेश पुनः लिख सकता हूं? क्या मैं प्रत्येक व्यक्ति को गिट मास्टर शाखा में "मैन्युअल रूप से" स्थानांतरित कर सकता हूं और गिट-एसवीएन डॉकिट करने से पहले प्रत्येक के प्रतिबद्ध संदेश को संशोधित कर सकता हूं?

उत्तर

4

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

अगली बार जब आप डॉकिट करते हैं, तो डॉकिट आपके इतिहास को एक बार में एक बार फिर से चलाएगा और यह सबवर्सन के लिए किया जाएगा।

अनुमान:

  1. स्थानीय शाखा मास्टर
  2. मास्टर की जाँच की है
  3. रिमोट ट्रैकिंग शाखा Git-svn नाम पर है है
  4. Git-SVN अप टू डेट है

क्या करें:

$ git rebase -i git-svn 

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

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

चेतावनियां:

आप अपने भंडार के इतिहास को फिर से लिखने कर रहे हैं, व्यायाम सावधानी। यह आत्मविश्वास महसूस होने तक इस व्यवहार के साथ सार्थक प्रयोग हो सकता है।

+1

गिट रिबेस -ई मधुमक्खी घुटनों है। केवल शाखाओं में प्रतिबद्ध संदेशों को बदलने के लिए बहुत आसान है, फिर रीबेस के साथ जारी रखें। – toholio

2

हां, आप प्रतिबद्ध संदेशों को फिर से लिख सकते हैं। हां, आप उन्हें केवल एक ही प्रतिबद्धता में स्क्वैश कर सकते हैं। यह शायद समीक्षा प्रक्रिया पर निर्भर करता है और आप एक साथ कितना कर रहे हैं।

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

कुल मिलाकर, जवाब "यह निर्भर करता है" और "गिट पर्याप्त है जो आपको चाहिए जो कुछ भी करने के लिए पर्याप्त है"।

8

मैं गिट पर एक शाखा में काम करता हूं, फिर चेकआउट मास्टर, git svn rebase और अंत में शाखा को मास्टर में विलय करता हूं।

इस बिंदु पर, git svn dcommit सभी अंतरिम एक समय में अपने मूल संदेशों के साथ svn में रखेगा - जो नहीं चाहता था! लेकिन अगर मैं git commit --amend का उपयोग मानक मर्ज संदेश से विलय के प्रतिबद्ध संदेश को बदलने के लिए करता हूं जो svn के लिए हमारी नीति को फिट करता है, तो डॉकिट उन्हें सभी को नए संदेश के तहत एक साथ लाएगा। जीत।

मुझे पता चला है कि यदि शाखा के जीवनकाल में मास्टर नहीं बदला गया है तो यह काम नहीं कर रहा है - यह केवल "विलय वाली शाखा" संदेश के साथ तेजी से आगे बढ़ता है - इसलिए यह सबसे अच्छा जोड़ता है --no-ffgit merge पर ध्वज।

सारांश:

git checkout branch 
<do work> 
git checkout master 
git svn rebase 
git merge --no-ff branch 
git commit --amend 
<policy-compliant commit message> 
git svn dcommit 
+0

बस यह सुनिश्चित करने के लिए कि मैं समझता हूं: इस दृष्टिकोण में 'मास्टर' का उपयोग 'svn' करने के लिए किया जाता है और सभी विकास और मध्यवर्ती कार्य' शाखा 'में होते हैं। सही? – Dror

+0

यदि आप 'मर्ज' चरण में "अच्छा" प्रतिबद्ध संदेश प्रदान करते हैं, तो आपको इसे 'संशोधित करने की आवश्यकता नहीं है। – Dror

+0

@ डोर यह सही है - मैं मास्टर पर काम नहीं कर रहा था। मुझे हाल ही में गिट-एसवीएन की आवश्यकता नहीं है, इसलिए यह संभव है कि गिट में बदलाव संशोधित प्रतिबद्धता को अनावश्यक बना दें। ISTR यह था जब मैंने उस उत्तर को लिखा, हालांकि :) –

1

यह एक कोशिश के लायक हो सकता है, मैं एक रिश्तेदार नौसिखिया हूँ, लेकिन यह मैं अब के लिए क्या कर रहा है:

# clone svn repository 
git svn clone .... 

एक बनाएँ:

दूरस्थ SVN भंडार का क्लोन बनाएं सामान्य Git भंडार (क्लोन का क्लोन):

# clone the clone :) 
git clone /path/to/original/clone 
git checkout -b working 

अब आप दूसरी क्लोन में काम कर सकते हैं, जैसे कि यह एक सामान्य Git भंडार थे (यह अनिवार्य रूप है):

# commit changes, whatever you like 
git ci 
... 

वापस केंद्रीय SVN भंडार में अपने परिवर्तन पुश करने के लिए पहली क्लोन करने के लिए वापस जाने के लिए और:

# pull and flatten changes 
git pull --squash /path/to/working/clone 

--squash पैरामीटर मतलब है कि सभी प्रतिबद्ध है कि में खींच रहे हैं विलय कर रहे हैं में से एक के लिए प्रतिबद्ध। यह प्रतिबद्धता तत्काल प्रतिबद्ध नहीं है ताकि आप तब कर सकें:

git ci 
git svn dcommit 

आखिरी चरण फिर सबकुछ एक ही प्रतिबद्धता के रूप में धक्का देता है।

संपादित - मैं सामान्य रूप से अन्य परिस्थितियों में --squash उपयोग करने की अनुशंसा नहीं होता लेकिन ध्यान दें कि काम कर रहे भंडार भरा पूरा इतिहास को बरकरार रखे हुए है (यह स्क्वैश के लिए प्रतिरक्षा है) लेकिन क्या आप नदी के ऊपर भेजने के एक भी साफ करने में कुचल है इस मामले में जो आवश्यक है। मेरा मानना ​​है कि यह एक उचित समझौता है।

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