2009-03-11 4 views
7

मैं उन फ़ाइलों को रखना चाहता हूं जो मैं अपने स्थानीय गिट भंडार में ट्रैक करता हूं जो कि जब मैं गिट-एसवीएन डॉकिट चलाता हूं तो केंद्रीय svn भंडार में चेक-इन नहीं किया जाता है। मैं प्रायः भंडार में ट्रैक की गई फ़ाइलों में लंबे समय तक स्थानीय-स्थानीय परिवर्तन करता हूं। कभी-कभी यह डीबगिंग कोड के लिए है। मेरे पास प्रोजेक्ट आईडीई फाइलें भी हैं जिन्हें मैं ट्रैक करना चाहता हूं। सादे पुराने svn के साथ, मैं बस उन फ़ाइलों को एक चेंजलिस्ट में डाल दूंगा जो "XYZ: चेक इन नहीं है" और फिर मैन्युअल रूप से समस्या का सामना करते हैं जब वास्तव में मेरे पास परिवर्तन करने की आवश्यकता होती है।मैं गिट-एसवीएन के साथ स्थानीय-केवल परिवर्तन/परिवर्तन सेट को कैसे ट्रैक करूं?

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

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

उत्तर

0

आप इसके लिए छेड़छाड़ का उपयोग करने पर विचार करना चाहेंगे।

git-stash - Stash the changes in a dirty working directory away 

हालांकि आप जो वर्णन कर रहे हैं उसके लिए इसे कम किया जा सकता है।

+0

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

+0

दरअसल, कुछ बदलाव जो मैं कभी नहीं करना चाहता हूं। शायद यह बुरा अभ्यास है, लेकिन यह सुविधाजनक रहा है। – normal

2

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

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

  1. प्रतिबद्ध का एक लॉग दिखाएँ SVN में जोड़ने के लिए:

    git co working 
    git cherry master 
    
  2. मास्टर शाखा करने के लिए सभी नदी के ऊपर प्रतिबद्ध जोड़ें, अनदेखी "निजी" करता है। इस चरण को तब तक दोहराएं जब तक कि सभी अपस्ट्रीम काम मास्टर में न हों।

    git co master 
    git cherry-pick <SHA1> 
    
  3. पुश SVN रेपो के लिए प्रतिबद्ध:

    git svn rebase 
    git svn dcommit 
    
+0

सुझाव के लिए धन्यवाद। मुझे उस पर वापस गिरना पड़ सकता है, लेकिन दोष यह है कि मुझे हर बार अतिरिक्त काम करना होगा। – normal

0

मैं कुछ शोध किया है और एक एक संभावना है कि यह कर सकता है के साथ आया था: एक ही निर्देशिका पर इशारा करते हुए 2 Git संग्रह। पर्यावरण परिवर्तनीय GIT_DIR स्थानीय भंडार निर्देशिका का नाम संग्रहीत करता है। अगर सेट नहीं होता है, तो git को .git पर डिफ़ॉल्ट करता है, लेकिन यह कुछ भी हो सकता है।

मैं जो कर सकता था उसके बाद एक रिपोजिटरी है .git जो मेरे सबवर्जन रिपोजिटरी में मैप करता है। यही आम मामला है। तो मैं .localgit में एक और भंडार हो सकता है। प्रत्येक भंडार को दूसरे द्वारा प्रबंधित फ़ाइलों को अनदेखा करने के लिए कॉन्फ़िगर किया जाना होगा। यह आसान है! पैटर्न को अस्वीकार करने के लिए।

जब मैं स्थानीय-केवल उन फ़ाइलों में परिवर्तन करता हूं जिन्हें मैं चेक करना चाहता हूं, तो मैं या तो अपना GIT_DIR वातावरण चर बदलता हूं या --git-dir कमांड लाइन तर्क का उपयोग करता हूं। अगर मेरे पास ठीक से सेट अप/अनदेखा है, तो मुझे टकराव के बारे में चिंता करने की आवश्यकता नहीं होगी। जाहिर है कि अद्यतित रखने के लिए कुछ ओवरहेड है, लेकिन मैं एक रैपर स्क्रिप्ट लिख सकता हूं जो फ़ाइल को दूसरे में जोड़ा जाने पर एक रेपो को बाहर करने के लिए एक फ़ाइल जोड़ता है। साथ ही, यह ओवरहेड कई शाखा सुझावों के साथ ही प्रत्येक प्रतिबद्धता के बजाए प्रति फ़ाइल एक बार होता है।

अगर मैं इसे आसान बनाना चाहता था, तो मैं नामकरण सम्मेलन का उपयोग कर सकता था, लेकिन मैं इसे प्रत्येक व्यक्तिगत फ़ाइल पर भी कर सकता हूं, क्योंकि स्थानीय-केवल फाइलों की संख्या एक अंक में लगभग निश्चित है (अन्यथा मैं ' मैं कुछ गलत कर रहा हूँ)।

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

2

समस्या का मेरा वर्तमान समाधान स्टैक्ड गिट (एसटीजी) का उपयोग करना और इन स्थानीय परिवर्तनों को अलग पैच के रूप में बनाए रखना है। जब मैं सबवर्सन में dcommit करने की जरूरत है, मैं बनाए रखने के इन अलग पैच के रूप में मैं आसानी से पैच कि मेरी इकाई परीक्षण संशोधित विभिन्न डेटाबेस बैकेंड परीक्षण करने के लिए हो सकता है है के बारे में

stg pop # naming the patches that should not be commited 
stg commit # the rest of the patches to commit 
git svn dcommit 
stg push # naming the patches that are used locally 

अच्छी बात है। तो सामान्य रूप से मैं ओरेकल के खिलाफ परीक्षण, लेकिन अगर मैं डर्बी के खिलाफ जांच करना चाहते हैं, मैं

stg push local-mods-derby 
ant tests 
stg pop 

करते हैं या मैं PostgreSQL के खिलाफ परीक्षण करने के लिए चाहते हैं, तो मैं

stg push local-mods-test-postgresql 
ant tests 
stg pop 

चलाने यहाँ, "स्थानीय mods- डर्बी "और" लोकल-मोड-टेस्ट-पोस्टग्रेस्क्ल "पैच नाम हैं।

तो काम के अलग-अलग पैच बनाए रखना stg के साथ बहुत आसान है।

1

क्या आपने मास्टर शाखा में काम नहीं किया है?

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

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