2010-04-22 12 views
24

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

क्या यह सामान्य है? मैं देख सकता हूं कि यह कैसे होगा, इस अर्थ में कि शाखा बी सोचता है कि यह वहां नहीं है, और शाखा ए सोचता है कि यह है, इसलिए जब मैं बी पर वापस जाता हूं तो यह 'इसे दूर करता है'। लेकिन यह कष्टप्रद है।

कोई सुझाव?

+0

क्या कोई कारण है कि आप इसे सभी शाखाओं में अनदेखा नहीं कर सकते हैं या इसे सभी शाखाओं में शामिल नहीं कर सकते हैं? – ewall

+0

यहां एक मजेदार समस्या है: यदि आप इसे शाखा ए पर .gitignore में जोड़ते हैं, और फिर उसे शाखा बी पर .gitignore में जोड़ना चाहते हैं, तो आपको शाखा बी चेकआउट करना होगा, जिस बिंदु पर फ़ाइल हटा दी गई है - इससे पहले कि आपके पास इसे अनदेखा करने का मौका। आपको अपनी कामकाजी निर्देशिका में शायद एक गंदे। गिटिनोरोर की आवश्यकता है, * फाइल को * जब आप हटाए गए फ़ाइल से बचने के लिए शाखाओं को स्विच करते हैं। – Armand

+0

@ एलिसन जी: आपका मामला ज्यादा समझ में नहीं आता है। ऐसा होने के लिए, फ़ाइल को शाखा ए पर * ट्रैक किया जाना चाहिए * इसलिए आप इसे शाखा ए पर गिटिग्नोर में कभी नहीं जोड़ पाएंगे। फ़ाइल को हटा दिया जा रहा है क्योंकि इसे एक शाखा पर ट्रैक किया गया है, और यह अस्तित्व में नहीं है अन्य। इसे अनदेखा करने का एकमात्र प्रभाव आपको बी से ए में जाने की अनुमति देता है बिना चेतावनी के कि आप कार्य पेड़ में एक फ़ाइल को ओवरराइट कर रहे हैं। – Cascabel

उत्तर

2

यह सामान्य है, हालांकि मैं इसके एक चरण से थोड़ा आश्चर्यचकित हूं।

जब आप बी से ए में स्विच करते हैं, तो गिट देखता है कि फ़ाइल को ए के संस्करण से मेल खाने के लिए अपडेट किया जाना चाहिए, और चुपचाप ऐसा करता है क्योंकि आपने इसे अनदेखा कर दिया है, कह रहा है कि जहां तक ​​शाखा बी का संबंध है, फाइल ' कोई फर्क नहीं पड़ता। इसे ऐसा करना है - एकमात्र विकल्प शाखा ए को जांचने से इनकार करना है। (यह अस्वीकार कर दिया जाएगा कि फ़ाइल को अनदेखा नहीं किया गया था, "अनचाहे काम करने वाली पेड़ फ़ाइल" को विलय करके अधिलेखित किया जाएगा। "मैं वास्तव में हैरान हूं यह इस मामले में भी नहीं करता है। किसी के पास यह सुविधा है कि क्या यह सुविधा या बग है?)

जब आप वापस स्विच करते हैं, तो गिट देखता है कि शाखा बी में उस फ़ाइल नहीं है, और इसे हटा देता है। फिर, इसे यह करना है। आपके दिमाग को पढ़ने का कोई तरीका नहीं है और यह महसूस होता है कि उस मिनट को अनदेखा किया गया था जो एक मिनट पहले था जिसे आप वापस चाहते हैं - यह आपको केवल शाखा बी की सामग्री देता है, जो बताता है कि फ़ाइल मौजूद नहीं है।

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

4

के बाद से केवल व्यवहार्य समाधान के लिए हर समय फ़ाइल 'f' ट्रैक करने के लिए है, तो आप, केवल शाखा B में एक एक gitattributes filter driver साथ smudge/clean process जोड़ सकता है,:

https://raw.github.com/adisp007/ProGit/master/figures/18333fig0702-tn.png

जब शाखा B checkouting:

  • धब्बा प्रक्रिया बदल जाएगा:

    • ("f की B सामग्री" एक ट्रैक किए गए फ़ाइल जो होते हैं, शाखा B के लिए,) एक अस्थायी फ़ाइल में f की सामग्री को बचाने
    • एक fbis फ़ाइल के साथ f की सामग्री की जगह
  • स्वच्छ प्रक्रिया होगा:

    • f बचाने 0,123,053 में सामग्री (के रूप में B में संशोधित)
    • (अस्थायी फ़ाइल के साथ) f अवयवों को रीस्टोर (fbis शाखा B में f संशोधनों के साथ प्रतिबद्ध हो जाता है), f अर्थ प्रतिबद्ध (B में नजरअंदाज कर दिया) नहीं है

आप में जोड़ सकते हैं, अभी भी शाखा B, custom merge driver जो fbis की रक्षा करेगा अन्य शाखाओं से विलय के मामले में B:
मर्ज ड्राइवर हमेशा B संस्करण रखेगा fbis सामग्री की, सुनिश्चित करें कि अनदेखा फ़ाइल f जब भी शाखा B चेक-आउट हो तो उसकी सामग्री वापस आती है।

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

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

+2

वाह, @ वोनसी यह एक अद्भुत जवाब है, बहुत बहुत धन्यवाद। मुझे यकीन नहीं है कि मैं इसे समझने के लिए पर्याप्त समझदार हूं हालांकि ... लटकाओ, कॉफी का एक और कप चाहिए ... –

+0

या प्रत्येक शाखा के लिए दो अलग-अलग कामकाजी निर्देशिकाएं हैं और चेकआउट समस्या से पूरी तरह से बचें ... एसवीएन के समान ब्रांचिंग मॉडल जो मैंने किया था। असंबद्ध नोट पर एक दिलचस्प इतिहास पढ़ा गया: http://blog.red-bean.com/sussman/?p=20 –

+0

@DanielSokolowski यह वास्तव में गिट 2.5 के बाद से संभव है: http://stackoverflow.com/a/39626426/6309 और http://stackoverflow.com/a/30185564/6309 – VonC

0

मैं एक ऐसी ही स्थिति का सामना करना पड़ा है, और मैं करता हूँ कि:

मैं फ़ाइल जो index.php की चेकआउट में नष्ट कर दिया कॉल करेंगे।

आपके।शाखा ए और शाखा बी की गिटिग्नोर आपकी index.php को अनदेखा करने वाली रेखा को हटा दें, इसके बाद दोनों शाखाओं में अपना .gitignore प्रतिबद्ध करें।

शाखा एक में,, index.php का बैकअप बनाने के इस हटा सकते हैं और करते हैं।

शाखा में पुनर्स्थापित एकindex.php अपने बैकअप से पहले बनाया था और अपने .gitignore में फिर से उपेक्षा index.php और इस के लिए प्रतिबद्ध।

अपने शाखा बी में, index.php जोड़ने अपने .gitignore में फ़ाइल की अनदेखी, प्रतिबद्ध और खुश हो।

+0

मेरे लिए काम नहीं करता है। – blinry

1

गिट में फ़ाइलों को अनदेखा करने का मतलब यह नहीं है कि वे संशोधन से बाहर हैं। आपके पास गिट में चेक इन और प्रबंधित फ़ाइल हो सकती है और इसे .gitignore में अनदेखा कर दिया गया है।

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