2011-05-11 11 views
22

मैंने कुछ फ़ाइलों पर git update-index --assume-unchanged का उपयोग किया है ताकि वे मेरे परिवर्तनों को प्रतिबद्ध होने से रोक सकें।"अपरिवर्तित" बिट के साथ फ़ाइलों में परिवर्तन छोड़ने के गिट स्टैश को रोकने के लिए कैसे?

भंडार में git stash का उपयोग करते समय, उन परिवर्तनों को किसी अन्य बकाया परिवर्तन के साथ रखा जाता है। यह व्यवहार की उम्मीद है, हालांकि git stash pop उन्हें वापस नहीं लाता है, इसलिए परिवर्तन अभी खो गए हैं।

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

+0

गिट स्टैश 1.7.2 में परिवर्तनों को छूता नहीं है। गिट का कौन सा संस्करण? –

+0

मेरा गिट संस्करण 1.7.1 पर है। मैं 1.7.2 को अपडेट करने का प्रयास करूंगा और देख सकता हूं कि यह ठीक करता है या नहीं। –

+0

दुर्भाग्य से मैं अभी भी इस व्यवहार को गिट संस्करण 1.7.5.1 में उबंटू पर देख रहा हूं। –

उत्तर

7

मान लें-अपरिवर्तित एक प्रदर्शन हैक है, और आपके द्वारा एक वादा का प्रतिनिधित्व करता है कि फ़ाइल नहीं बदली है। यदि आप वास्तव में फ़ाइल को बदलते हैं तो सभी दांव बंद हैं। आपको या तो अपने रेपो को पुन: व्यवस्थित करना चाहिए ताकि आप इन फ़ाइलों को नहीं कर सकें (शायद filename.sample और .gitignore फ़ाइल नाम दें) या शाखाओं के साथ चालें चलाएं ताकि आप जिन फ़ाइलों को नहीं चाहते हैं, वे बाकी दुनिया के साथ साझा हो जाएं शाखा या अन्यथा छुपाया।

मैंने इन परिवर्तनों को छिपाने के तरीके पर चार सुझावों को देखा/सोचा है।

1: फ़ाइल को चेकआउट पर जो भी आप चाहते हैं उसे बदलने के लिए धुंध/साफ फ़िल्टर का उपयोग करें और इसे चेकइन पर साफ़ करें। बदसूरत।

2: http://thomasrast.ch/git/local-config.html में वर्णित स्थानीय कॉन्फ़िगरेशन शाखा बनाएं यहां याद रखने की महत्वपूर्ण बात यह है कि आप प्राथमिक शाखा पर विकसित होते हैं और परीक्षण के लिए कॉन्फ़िगरेशन शाखा में विलय करते हैं। बदलने के लिए प्राथमिक शाखा में वापस जाएं, पुश इत्यादि।

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

4: एक निजी विकास शाखा बनाएं, वह परिवर्तन करें जिसे आप कभी साझा नहीं करना चाहते हैं, और उसके बाद एक मर्ज ड्राइवर बनाएं (मैन गिटैट्रिब्यूट देखें) जो फ़ाइल से मास्टर को निजी से या निजी से मास्टर में विलय करने से इनकार कर देगा (शायद निजी शाखा पर फ़ाइल के एसएचए की तुलना विभिन्न शाखाओं के एसएचए में कर कर और पिछले मूल्य की प्रतिलिपि बनाने से पहले की प्रतिलिपि बनाकर)।

+0

जैसा है, मैंने निजी विकास शाखा को जाने दिया। मैंने एक निजी शाखा बनाई, मेरे निजी परिवर्तनों के साथ प्रतिबद्धता की, फिर मुख्य शाखा में वापस स्विच किया और एक विलय '-एस हमारा' किया।जब मैंने मुख्य शाखा को निजी शाखा में विलय कर दिया, तो यह मेरे परिवर्तनों को ओवरराइड करता है – Casebash

+0

@ कैसबैश: आपने जो कुछ भी हो रहा था उसका पूरी तरह से वर्णन नहीं किया था, लेकिन मैं अनुमान लगाउंगा और कहूंगा कि मुख्य शाखा ने आपके द्वारा बदली गई फ़ाइल को बदल दिया है। मुख्य रूप से निजी में विलय करने के बाद इससे उन परिवर्तनों को निजी शाखा में प्रचारित किया जाएगा। यदि आप पूरी तरह से निजी से मुख्य रूप से विलय कर रहे हैं, तो आप पुराने संस्करण और विलय-हमारे फिर से प्राप्त करने के लिए चेकआउट HEAD^- myfile' को गिट कर सकते हैं। हमारा उद्देश्य निजी पर परिवर्तन को मुख्य रूप से बदलने से रोकता है। मुख्य रूप से निजी होने से नए बदलावों को कुछ भी नहीं रोक सकता है (जब तक कि एक ही प्रतिबद्धता में उस फ़ाइल को बदला नहीं जाता)। –

+0

@Casebash: ठीक है, मैंने कुछ भी नहीं कहा लेकिन मुझे बस गिट की एक साफ विशेषता याद आई। आप कस्टम मर्ज ड्राइवर को परिभाषित कर सकते हैं जो विलय के दौरान कोई भी बदलाव करने से इंकार कर देगा। हालांकि, मर्ज ड्राइवर को शाखा को अवगत होना होगा। आप नहीं चाहते कि परिवर्तन निजी में या बाहर जा रहे हों, लेकिन आप * मूल * मुख्य से मुख्य में शामिल होना चाहते हैं। –

0

यह प्रश्न Preserve git --assume-unchanged files between branch checkouts के समान है। वहां मैंने इन परिवर्तनों के साथ एक निजी शाखा का उपयोग करने का प्रस्ताव दिया, जिसे मैं यहां http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html का विवरण देता हूं।

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