क्या मैं एक फ़ाइल को 'कमिट' कर सकता हूं और इसके सामग्री परिवर्तनों को अनदेखा कर सकता हूं?


355

मेरी टीम के प्रत्येक डेवलपर का अपना स्थानीय कॉन्फ़िगरेशन है। उस कॉन्फ़िगरेशन जानकारी को एक फ़ाइल में संग्रहीत किया जाता है devtargets.rbजिसे हमारे रेक बिल्ड कार्यों में उपयोग किया जाता है। मैं नहीं चाहता कि डेवलपर्स एक-दूसरे के डेवॉर्जमेंट फ़ाइल को क्लोब करें।

मेरा पहला विचार उस फ़ाइल को .gitignoreसूची में रखना था ताकि वह git के लिए प्रतिबद्ध न हो।

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

क्या यह संभव है? यह निश्चित रूप से एक अच्छी सुविधा होगी ...


1
इसी तरह के विषय पर stackoverflow.com/questions/3318043/… भी देखें ।
वॉनसी


जवाबों:


458

ज़रूर, मैं समय-समय पर इसका उपयोग करता हूं

git update-index --assume-unchanged [<file> ...]

पूर्ववत करने के लिए और फिर से ट्रैकिंग शुरू करें (यदि आप भूल गए कि कौन सी फाइलें अनट्रैक थीं, तो यह प्रश्न देखें ):

git update-index --no-assume-unchanged [<file> ...]

प्रासंगिक दस्तावेज :

- [नहीं-] धारणा-अपरिवर्तित
जब यह ध्वज निर्दिष्ट किया जाता है, तो पथों के लिए दर्ज की गई वस्तु के नाम अपडेट नहीं किए जाते हैं। इसके बजाय, यह विकल्प पथों के लिए "अपरिवर्तित मान" को सेट / अनसेट करता है। जब "मान अपरिवर्तित" बिट चालू होता है, तो उपयोगकर्ता फ़ाइल को नहीं बदलने का वादा करता है और गिट को यह मानने की अनुमति देता है कि कार्यशील ट्री फ़ाइल सूचकांक में दर्ज की गई चीज़ों से मेल खाती है। यदि आप वर्किंग ट्री फ़ाइल को बदलना चाहते हैं, तो आपको गिट को बताने के लिए थोड़ा परेशान होना होगा। यह कभी-कभी मददगार होता है जब किसी बड़ी परियोजना के साथ काम करना एक फाइल सिस्टम पर होता है जिसमें बहुत धीमी lstat(2)प्रणाली कॉल होती है (जैसे cif)।

यदि किसी कमेटी में विलय करते समय सूचकांक में इस फ़ाइल को संशोधित करने की आवश्यकता होती है, तो Git (कृपापूर्वक) विफल हो जाएगा; इस प्रकार, यदि मान लिया गया कि अनट्रैक की गई फ़ाइल को अपस्ट्रीम में बदल दिया जाता है, तो आपको स्थिति को मैन्युअल रूप से संभालना होगा।

इस मामले में इनायत से असफलता का मतलब है, अगर कोई फ़ाइल में बदलाव (वैध परिवर्तन, आदि) होता है जब आप एक पुल करते हैं, तो यह कहेगा:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

और विलय करने से इंकार कर देगा।

उस बिंदु पर, आप अपने स्थानीय परिवर्तनों को देखते हुए इसे दूर कर सकते हैं, यहां एक तरीका है:

 $ git checkout filename.ext

फिर फिर से खींचें और अपनी स्थानीय फ़ाइल को फिर से संशोधित करें, या सेट –no-assume-unchangedकर सकते हैं और आप उस बिंदु पर सामान्य स्लैश और मर्ज कर सकते हैं, आदि।


10
क्या यह कमांड स्थानीय रूप से .git फ़ोल्डर में अपनी बात करता है? मेरा मतलब है, अगर मैं config.php फ़ाइल के लिए यह कमांड चलाता हूं, तो क्या यह अन्य उपयोगकर्ताओं के लिए प्रचार करेगा जो रेपो का उपयोग कर रहे हैं?
मगस

16
@Magus: नहीं। यह केवल आपके लिए काम करेगा।
रॉब विल्करसन

3
और जल्द ही बाद में आप जानना चाहते हैं कि कैसे निर्धारित करने के लिए एक फ़ाइल अपरिवर्तित है: stackoverflow.com/questions/2363197/…
Ciro Santilli 郝海东 going going 事件

10
इस तरह से अनदेखा की गई फ़ाइलों के परिवर्तन "गिट स्टैश" का उपयोग करने पर खो जाते हैं। क्या इसके आसपास कोई रास्ता है?
एलेक्सिस

5
यह वह नहीं है जो git update-index --assume-unchangedइसके लिए है। public-inbox.org/git/…
jsageryd

97

इसका उपयोग करने का पसंदीदा तरीका इस उत्तर मेंgit update-index --skip-worktree <file> बताया गया है :

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

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

इसे पूर्ववत करने के लिए, उपयोग करें git update-index --no-skip-worktree <file>

संस्करण 2.25.1 के बाद से, यह अब उद्धृत करने का अनुशंसित तरीका नहीं है:

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

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


क्या यह सभी उपयोगकर्ताओं के लिए काम करता है जो रिपॉजिटरी की जांच करते हैं? क्या उन्हें कुछ फाइलें मिलेंगी, लेकिन जब तक स्पष्ट रूप से ऐसा नहीं कहा जाता, तब तक वे गलती से भी बदलाव नहीं कर पाएंगे।
एमएमएम

2
@momomo ध्वज को इंडेक्स में संग्रहीत किया गया है इसलिए नहीं, यह केवल एक उपयोगकर्ता के लिए है। सभी उपयोगकर्ताओं के लिए काम करने वाली चीज़ के लिए erjiang का उत्तर देखें ।
1615903

मैं यह पता लगाने की कोशिश कर रहा हूं कि फाइल की सामग्री क्या होनी चाहिए। मैंने आपके द्वारा भेजे गए उत्तर पर टिप्पणी की, लेकिन कोई उत्तर नहीं मिला। यह कहाँ स्थित है और इसकी सामग्री क्या है? क्या आप जानते हैं?
एमएमएम

मैं पीछा नहीं कर रहा हूँ। कमांड में निर्दिष्ट एक विशिष्ट फ़ाइल को अनदेखा करने के लिए कमांड का उपयोग किया जाता है। उस फ़ाइल की सामग्री प्रासंगिक नहीं है।
1615903

1
Git प्रलेखन विशेष रूप से उपयोग नहीं कहते हैं git update-index --skip-worktreeइस उद्देश्य के लिए।
bk2204

43

सामान्य अभ्यास लगता है कि इसे बनाने devtargets.default.rbऔर इसे बनाने के लिए, और फिर प्रत्येक उपयोगकर्ता को उस फ़ाइल को कॉपी करने के लिए निर्देश दें devtargets.rb(जो कि .ignignger सूची पर है)। उदाहरण के लिए, CakePHP अपने डेटाबेस कॉन्फ़िगरेशन फ़ाइल के लिए वही करता है जो स्वाभाविक रूप से मशीन से मशीन में बदलता है।


6
आप ट्रैक की जा रही फ़ाइल को .ignignore नहीं कर सकते हैं। .gitignore केवल उन फ़ाइलों के लिए प्रभाव रखता है जो इंडेक्स में नहीं हैं।
CB बेली

1
मैं ऐसा करने से बचने की कोशिश कर रहा था, हालांकि मेरे पास वास्तव में एक अच्छा कारण नहीं है। अब हम यह कर रहे हैं और मुझे लगता है कि यह याद रखने के लिए एक दर्द है कि मुझे नाम के बिना ".default" अपना संस्करण बनाने की आवश्यकता है।
डेरिक बैली

11
@DerickBailey लेकिन निष्पक्ष होना, फ़ाइल को कॉपी करने की तुलना में याद रखना आसान है, --assume-unchangedजो कि रिपॉजिटरी को क्लोन करने वाले सभी लोगों के लिए विकल्प का उपयोग करके याद रखें ।
दान

1
@DerickBailey आप अपने रेक बिल्ड को डिफ़ॉल्ट रूप से सेट कर सकते हैं devtargets.default.rbयदि devtargets.rbमौजूद नहीं है।
ल्यूक

@erjang उस devtargets.default.rb फ़ाइल में क्या है? एक उदाहरण?
एमएमएम

2

IntelliJ IDEA उपयोगकर्ताओं के लिए: यदि आप किसी फ़ाइल (या फ़ाइलों) के लिए परिवर्तनों को अनदेखा करना चाहते हैं, तो आप इसे अलग-अलग स्थानांतरित कर सकते हैं Change Set

  • Local Changes( Cmd + 9) को हेड करें
  • वह फ़ाइल चुनें जिसे आप अनदेखा करना चाहते हैं
  • F6 उन्हें दूसरे स्थान पर ले जाने के लिए Change Set
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.