2008-10-01 11 views
42

the manual के अनुसार, git dcommit "गिट में प्रत्येक प्रतिबद्धता के लिए एसवीएन में संशोधन करेगा।" लेकिन क्या कई सबवर्जन संशोधन से बचने का कोई तरीका है? यही है, svn commit करने से पहले गिट को सभी बदलावों को मर्ज करना है?क्या एक एसवीएन प्रतिबद्धता में गिट svn dcommit परिणाम बनाना संभव है?

+0

मेरे पास एक ही समस्या है। कल्पना करें कि आप अपने मास्टर के रूप में गिट करने के लिए एक एसवीएन रेपो क्लोन करते हैं, तो आप विभिन्न संदेशों के साथ 3 काम करते हैं और फिर गिट svn dcommit का उपयोग करते हैं। क्या यह एक ही में इस 3 कामों को "विलय" करना संभव है? आप यह कैसे कर सकते हैं ? क्या आप हमें एक उदाहरण दे सकते हैं? Thnks! – sergiofbsilva

+0

[संभावित गिट को गिट-एसवीएन के लिए एक प्रतिबद्धता में जोड़ती है] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1408381/combine-local-git-commits-into-one-commit-for-git-svn) – centic

उत्तर

34

यदि आप गिट में शाखा पर काम करते हैं, तो आप git-merge --squash कर सकते हैं, जो कि गिट के भीतर करता है। फिर आप एसवीएन को एक स्क्वैश प्रतिबद्ध कर सकते हैं।

बेशक, बहुत से छोटे काम अच्छे हैं, तो आप उन्हें क्यों स्क्वैश करना चाहते हैं?

+0

धन्यवाद!(आम तौर पर मैं बहुत कम काम करना चाहता हूं, लेकिन यह एक क्लाइंट प्रोजेक्ट से संबंधित है जहां मैं और मेरे साथी को अक्सर एक-दूसरे के बीच परिवर्तनों को धक्का देना पड़ता है, और अक्सर ट्रंक तोड़ने वाले बदलाव भी होते हैं।) – plindberg

+0

आप दोनों क्यों काम नहीं करते वही (svn) शाखा, तो? –

+2

मैं परिवर्तनों को ट्रैक करना आसान बनाने के लिए बहुत सी छोटी प्रतिबद्धताओं का उपयोग करता हूं; जब मैं svn सर्वर के लिए dcommit, हम प्रत्येक एसवीएन प्रतिबद्ध के लिए एक ईमेल उत्पन्न करते हैं। मैं बजाय "लॉजिकल यूनिट" के लिए स्क्वैश के साथ मास्टर में विलय करने का अतिरिक्त काम करता हूं और हर किसी को कुछ ईमेल बचाता हूं। – cbowns

27

कमांड git rebase -i यह और भी कर सकता है। यह आदेश बेहद शक्तिशाली है, इसलिए दोस्तों के साथ इसे बनाना अच्छा है।

वाक्यविन्यास है: git rebase -i <commit ID>। यह दिए गए आईडी तक (सभी सहित) को संशोधित करने के लिए विकल्प (और निर्देश) के साथ आपके टेक्स्ट एडिटर को लाता है।

उदाहरण के लिए, पिछले 5 करता संशोधित करने के लिए, आप यह कर सकते हैं:

git rebase -i HEAD~5

या अपने SVN शाखा "SVN/ट्रंक" कहा जाता है, तो इस वाक्य अच्छा भी है:

git rebase -i svn/trunk

फिर एक टेक्स्ट एडिटर विंडो पॉप अप हो जाएगी। सबकुछ स्क्वैश करने के लिए, "पिक" से "स्क्वैश" से पहले प्रत्येक पंक्ति के पहले शब्द को बदलें (यदि यह उलझन में आता है- जब आप इसे देखते हैं तो इससे अधिक समझदारी होगी)। फिर संपादक को सहेजें और बंद करें। इसके बाद आपको स्क्वैश किए गए प्रतिबद्धता के लिए प्रतिबद्ध संदेश संपादित करने का मौका मिलेगा।

अन्य चीजों के साथ आप git rebase -i के साथ कर सकते हैं, फिर से काम कर रहे हैं, स्क्वैशिंग अलग-अलग तरीकों से काम करता है, और काम करता है।

मैं लगातार इस आदेश का उपयोग करता हूं; यह गिट की एक हत्यारा विशेषता है।

7

Ryan Tomayko थोड़ा के बारे में git rebase -i है, जिसमें उन्होंने कहा लिखा है:

... Git की तरह एक सा प्रतिबद्ध --amend पर उछल [यह] एसिड और एक चेनसॉ पकड़े - पूरी तरह पागल है और काफी खतरनाक है, लेकिन करने में सक्षम दिमाग के पूरी तरह से नए राज्यों को उजागर करना। यहां आप संपादन, स्क्वैश, रीडरिंग, चिढ़ा सकते हैं, और मौजूदा कामों को इस तरह से एनोटेट कर सकते हैं कि यह आसान और अधिक सहज होना चाहिए।

मैं Git में अक्सर प्रतिबद्ध करने के लिए एक प्रवृत्ति है, लेकिन आवश्यक रूप dcommit को हर svn करने के लिए प्रतिबद्ध है, और मेरे सारे काम कुचलने बस के रूप में थोड़ा समझ में आता है चाहता हूँ। मैं इसे अब कुछ और लॉजिकल प्रतिबद्ध इकाइयों में एक साथ फिर से व्यवस्थित करने और स्क्वैश करने की कोशिश कर रहा हूं।