2012-11-29 23 views
240

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

कुछ खोदने के बाद, मुझे 2 विकल्प दिखाई देते हैं: 'मान लें-अपरिवर्तित' और 'स्किप-वर्कट्री'। एक पिछले प्रश्न here उनके बारे में बात करता है लेकिन वास्तव में उनके मतभेदों को समझाता नहीं है। मेरा सवाल यह है: दो आदेश अलग कैसे हैं? कोई एक या दूसरे का उपयोग क्यों करेगा?

+0

आमतौर पर मैं '.gitignore' उपयोग कर रहा हूँ समान उद्देश्यों के लिए। क्या यह समाधान आपके लिए काम करेगा? – samuil

+15

सैमुइल, .gitignore जोड़ना, बदलना नहीं अनदेखा करता है। जब फ़ाइल पहले से ही गिट में है तो इसे ट्रैक किया जाएगा यदि यह सूचीबद्ध है .gitignore – Grigory

+0

@Grigory मुझे यह नहीं पता था। धन्यवाद! –

उत्तर

346

आप skip-worktree चाहते हैं।

assume-unchanged उन मामलों के लिए डिज़ाइन किया गया है जहां यह जांचना महंगा है कि फ़ाइलों का समूह संशोधित किया गया है या नहीं; जब आप बिट सेट करते हैं, git (ज़ाहिर है) मानता है कि इंडेक्स के उस भाग से संबंधित फाइलें कामकाजी प्रति में संशोधित नहीं की गई हैं। इसलिए यह stat कॉल की गड़बड़ी से बचाता है। जब भी इंडेक्स में फ़ाइल की प्रविष्टि बदलती है तो यह बिट खो जाता है (इसलिए, जब फ़ाइल अपस्ट्रीम बदल जाती है)।

skip-worktree कि तुलना में अधिक है: यहां तक ​​कि जहां gitजानता उस फ़ाइल संशोधित किया गया है (या एक reset --hard या तरह से संशोधित करने की आवश्यकता), यह नाटक नहीं किया गया है, सूचकांक से संस्करण का उपयोग बजाय। यह तब तक जारी रहता है जब तक इंडेक्स को त्याग दिया न जाए।

इस अंतर की विधियों और यहां सामान्य उपयोग के मामलों का एक अच्छा सारांश है: http://fallengamer.livejournal.com/93321.html

उस लेख से:

  • --assume-unchanged मानता है कि एक डेवलपर नहीं परिवर्तन एक फ़ाइल चाहिए। यह ध्वज के लिए एसडीके जैसे फ़ोल्डर बदलने के लिए प्रदर्शन में सुधार करने के लिए है।
  • --skip-worktree उपयोगी है जब आप गिट को किसी विशिष्ट फ़ाइल को स्पर्श न करने का निर्देश देते हैं क्योंकि डेवलपर्स इसे बदलना चाहिए। उदाहरण के लिए, यदि मुख्य भंडार अपस्ट्रीम कुछ उत्पादन-तैयार कॉन्फ़िगरेशन फ़ाइलें होस्ट करता है और आप उन फ़ाइलों में गलती से परिवर्तन नहीं करना चाहते हैं, तो --skip-worktree वही है जो आप चाहते हैं।
+3

यह समझ में आता है। स्किप-वर्क्री वास्तव में जाने का रास्ता प्रतीत होता है। धन्यवाद! – ckb

+2

आप [git-update-index (1) मैन्युअल पृष्ठ] (http://git-scm.com/docs/git-update-index) में दो आदेशों के बारे में अधिक जानकारी प्राप्त कर सकते हैं। – Senseful

+44

खोज और पढ़ने के कुछ सेकंड बचाने के लिए एक छोटा सा नोट। '--skip-worktree' प्रभावों को रद्द करने और ध्वज को अनसेट करने के लिए '--no-skip-worktree' विकल्प' है। बिल्कुल वही काम करता है। यदि हाथ गिर गया था और गलत फाइलों को ध्वजांकित किया गया था, तो यह उपयोगी है, या यदि परिस्थितियों में बदलाव आया था और पहले छोड़ी गई फ़ाइलों को अब अनदेखा नहीं किया जाना चाहिए। – drdaeman

61

नोट: fallengamer 2011 में कुछ परीक्षण किया था (ताकि वे पुराना हो सकता है), और यहाँ उसकी findings हैं:

संचालन

  • फ़ाइल स्थानीय भंडार में और नदी के ऊपर दोनों बदल गया है
    git pull:
    गिट स्थानीय परिवर्तनों को वैसे भी संरक्षित करता है।
    इस प्रकार आप किसी भी झंडे के साथ चिह्नित किसी भी डेटा को गलती से खो नहीं पाएंगे।साथ assume-unchanged झंडा
    • फ़ाइल: Git स्थानीय फ़ाइल को अधिलेखित नहीं होगा। इसके बजाय यह विवादों को आउटपुट करेगा और सलाह देगा कि उन्हें कैसे हल किया जाए
    • skip-worktree ध्वज: गिट स्थानीय फ़ाइल को ओवरराइट नहीं करेगा। इसके बजाय यह उत्पादन संघर्ष और सलाह उन्हें कैसे

को हल करने हैं।

  • फ़ाइल स्थानीय भंडार में और नदी के ऊपर दोनों बदल गया है, वैसे भी
    git stash
    git pull
    कुछ अतिरिक्त शारीरिक श्रम में उपयोग करना skip-worktree परिणाम लेकिन कम से कम आप किसी भी डेटा खो नहीं होगा खींचने की कोशिश कर अगर आप किसी भी स्थानीय परिवर्तन किया था। साथ assume-unchanged झंडा
    • फ़ाइल: उन्हें बहाल करने के लिए किसी भी संभावना के बिना सभी स्थानीय परिवर्तन को रद्द करें। प्रभाव 'git reset --hard' की तरह है। 'git pull' कॉल के साथ skip-worktree झंडा
    • फ़ाइल सफल होगा: छिपाने की जगह skip-worktree फ़ाइलों पर काम नहीं होता। 'git pull' ऊपर के रूप में ही त्रुटि के साथ विफल हो जाएगा। डेवलपर मैन्युअल रूप से रीसेट करने के लिए skip-worktree झंडा छिपाया और नाकाम रहने pull पूरा करने के लिए सक्षम होने के लिए मजबूर किया जाता है।

  • कोई स्थानीय परिवर्तन, नदी के ऊपर फ़ाइल
    git pull
    दोनों झंडे बदल नदी के ऊपर के परिवर्तन प्राप्त करने से रोक नहीं होगा। Git पता लगाता है कि आप assume-unchanged वादा तोड़ दिया और ध्वज रीसेट करके वास्तविकता को प्रतिबिंबित करने के choses। साथ assume-unchanged झंडा
    • फ़ाइल: सामग्री अद्यतन किया जाता है, झंडा खो दिया है।
      'git ls-files -v' दिखाएगा कि ध्वज H (h से) में संशोधित किया गया है।
    • skip-worktree ध्वज के साथ फ़ाइल: सामग्री अद्यतन है, ध्वज संरक्षित है।
      'git ls-files -v' pull पहले की तरह ही S झंडा दिखा सकती है।

  • स्थानीय फ़ाइल के साथ
    git reset --hard
    Git बदल skip-worktree फ़ाइल स्पर्श नहीं करता है और वास्तविकता को दर्शाता है assume-unchanged फ़ाइल के लिए (फ़ाइल में बदलाव नहीं करने के लिए वास्तव में बदल गया था वादा किया था)। assume-unchanged ध्वज के साथ
    • फ़ाइल: फ़ाइल की सामग्री को वापस लाया गया है। ध्वज H पर रीसेट किया गया है (h से)।
    • skip-worktree ध्वज के साथ फ़ाइल: फ़ाइल सामग्री बरकरार है। ध्वज एक ही रहता है।

वह निम्नलिखित विश्लेषण कहते हैं:

  • ऐसा लगता है कि skip-worktreeहै की तरह बहुत आपके स्थानीय डेटा संरक्षित करने के लिए कोशिश कर रहा। लेकिन यह सुरक्षित होने पर अपस्ट्रीम परिवर्तन प्राप्त करने से नहीं रोकता है। प्लस गिट pull पर ध्वज को रीसेट नहीं करता है।
    लेकिन 'reset --hard' कमांड को अनदेखा करने से डेवलपर के लिए खराब हो सकता है।

  • Assume-unchanged ध्वज pull ऑपरेशन पर खोया जा सकता है और ऐसी फ़ाइलों के अंदर स्थानीय परिवर्तन गिट के लिए महत्वपूर्ण नहीं लगते हैं।

देखें:

उन्होंने निष्कर्ष निकाला है:

असल झंडे के न पर्याप्त सहज है

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

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

+5

यदि आपके पास फ़ाइल और अपस्ट्रीम परिवर्तनों पर स्किप-वर्क्री है, तो आप खींचने का प्रयास करते समय "कृपया प्रतिबद्ध या छेड़छाड़ करें", भले ही गिट स्थिति फ़ाइल को बदले में रिपोर्ट न करे। आप इससे कैसे बच सकते हैं, इसलिए स्थानीय परिवर्तन तब तक जारी रह सकते हैं जब लोग मूल रूप से उत्पादन सेटिंग के साथ मिल रहे हैं? – GreenAsJade

+0

@GreenAsJade सुनिश्चित नहीं है: यह एक अच्छा सवाल होगा (इस पर एक लिंक के साथ)। मुझे लगता है कि आपको 'स्किप-वर्कट्री' के बजाय 'अनुमान-अपरिवर्तित' के साथ एक समान संदेश मिलेगा। – VonC

+3

हां, मैं पुष्टि कर सकता हूं कि आप करते हैं। इसका मतलब है कि स्थानीय फ़ाइल रखना अभी भी बहुत कठिन है जिसे आप मूल रूप से अलग-अलग बनाए रखना चाहते हैं। – GreenAsJade