मैं किसी फ़ाइल में भविष्य के संशोधनों को कैसे अनदेखा कर सकता हूं?


140

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

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

हम आम तौर पर बहुत आलसी होते हैं और git add .बहुत अधिक उपयोग करते हैं, इसलिए मुझे पूरा यकीन है कि अगर मैं इस फाइल को अनदेखा करने के लिए गिट को नहीं बता सकता हूं, तो इसमें परिवर्तन प्रतिबद्ध और धक्का दिया जाएगा।

संक्षेप में,

  1. मैं एक फ़ाइल बनाना चाहूंगा, इसे कॉल default_values.txtकरूंगा जो मेरे गिट रिपॉजिटरी में जोड़ा गया है और इसमें शामिल है जब कोई उस रिपॉजिटरी को क्लोन करता है।
  2. git add .default_values.txtकमिट में नहीं जोड़ना चाहिए ।
  3. इस व्यवहार को रिपॉजिटरी के किसी भी क्लोन पर पारित किया जाना चाहिए।

1
क्या आप प्री-कमिट हुक करने के लिए git हुक का उपयोग कर सकते हैं जो कि अगर फाइल संशोधित किया गया है तो एक कमिट को रद्द कर देगा default_values.txt (say)?
साकेत

1
Git purists कहेंगे कि आलसी मत बनो और मंचन क्षेत्र का सही ढंग से उपयोग करो, यही वह है।
Xint0

Git शुद्धतावादियों का कहना है कि स्मूदी / स्वच्छ स्क्रिप्ट का उपयोग करेंगे। यह सबसे अधिक रखरखाव योग्य समाधान है।
एडम डिमिट्रुक

1
Xint0: सच है। लेकिन आप अन्य लोगों को गलती से जाँच करने से कैसे रोक सकते हैं?
एलन

जवाबों:


115

जैसा कि कई अन्य लोगों ने उल्लेख किया है, एक अच्छा आधुनिक समाधान है:

git update-index --skip-worktree default_values.txt

जब तक आप उन्हें फिर से अनुमति देने का निर्णय नहीं लेते, तब तक उस फ़ाइल के परिवर्तनों को स्थानीय और अपस्ट्रीम दोनों में अनदेखा कर देंगे:

git update-index --no-skip-worktree default_values.txt

आप उन फ़ाइलों की एक सूची प्राप्त कर सकते हैं जिन्हें चिह्नित किया गया है:

git ls-files -v . | grep ^S

ध्यान दें कि इसके विपरीत --skip-worktree, --assume-unchangedअपस्ट्रीम परिवर्तन को खींचने के बाद स्थिति खो जाएगी।


2
यदि कोई अन्य व्यक्ति रेपो खींचता है और फ़ाइल को संपादित करता है, तो क्या उनकी निर्देशिका में परिवर्तन को अनदेखा किया जाता है? मुझे उम्मीद है कि उन्हें --no-skip-worktreeअपने परिवर्तनों को जोड़ने के लिए टाइप करना होगा ।
नेउम्यूजिक

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

3
ध्यान दें कि आपको --skip-worktreeशाखाओं को स्विच करने से पहले किसी फ़ाइल की स्थिति को पूर्ववत करना पड़ सकता है , यदि उसी फ़ाइल को दूसरी शाखा में ट्रैक किया गया हो।
मूडबॉम

3
हम्म, यह काम करता है ... जब मैंने फ़ाइल में कुछ बदलाव किया तो इसे नहीं दिखाया गया था git status, लेकिन जब मैंने अलग-अलग शाखा में चेकआउट करने की कोशिश की, तो मुझे मिल गया है error: Your local changes to the following files would be overwritten by checkout: , यहाँ तक कि -f भी मदद नहीं करता हैerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
ykravv

1
मैं इन के लिए git ignoreऔर अन्य है git unignore
माइकल

48

तुम जो खोज रहे हो, वह है git update-index --assume-unchanged default_values.txt

अधिक जानकारी के लिए डॉक्स देखें: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html


11
यह काम नहीं करता। हालांकि यह गिट ऐड बनाता है। स्थानीय शाखा पर फ़ाइल को अनदेखा करें, संग्रह के क्लोन में यह व्यवहार नहीं है (यदि आप क्लोन संग्रह में default_values.txt को बदलते हैं, तो इसे "git add" के साथ कमिट में जोड़ा जाएगा)
Marc

6
हां, क्योंकि आप इसे केवल स्थानीय रेपो के लिए सेट कर रहे हैं। आप इस तरह की जानकारी को आगे नहीं बढ़ा सकते।
तमसाड

8
@ इंद्रधनुश - यह समाधान मानदंड को संतुष्ट नहीं करता है 3 - "व्यवहार को रिपॉजिटरी के किसी भी क्लोन पर पारित किया जाना चाहिए" - यही कारण है कि मैंने इसे स्वीकार नहीं किया। इसका मतलब यह नहीं है कि यह एक अच्छा जवाब नहीं है।
मार्क

मैंने कभी भी 3 मानदंड पर ध्यान नहीं दिया। क्योंकि मैं इसकी तलाश नहीं कर रहा था। :)
इन्द्रधनुष गुप्ता

3
निजी एप्लिकेशन सेटिंग्स के साथ स्थानीय कॉन्फ़िगरेशन फ़ाइलों के लिए, आप संभवतः अधिक जानकारी stackoverflow.com/questions/13630849/… केskip-worktree बजाय उपयोग करना चाहते हैंassume-unchanged
हारून हॉफमैन 19

22

आमतौर पर मैंने जो दृष्टिकोण देखा है, वह एक अलग नाम के साथ एक फ़ाइल बनाने के लिए है, जैसे: default_values_template.txt और अपने .gitignore में default_values.txt डाल दिया है। लोगों को निर्देश दें कि वे अपने स्थानीय कार्यक्षेत्रों में default_values_template.txt को default_values.txt पर कॉपी करें और आवश्यकतानुसार परिवर्तन करें।


हम्म् ... हो सकता है कि मैं डिफ़ॉल्ट रूप से कॉपी करने के लिए डिफ़ॉल्ट रूप से मौजूद नहीं होने पर डिफ़ॉल्ट रूप से कॉपी करने के लिए एक हुक लिख सकता हूँ?
मार्क

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

मुझे लगता है कि समाधान वास्तव में कुछ ऐसा करने के लिए है, अधिमानतः एक स्क्रिप्ट के साथ निष्पादित जब भी आप खींचते हैं या क्लोन करते हैं। एक विचार यह होगा कि किसी विशेष एक्सटेंशन (कहते हैं .basefile) के साथ कुछ भी फ़ाइल को एक्सटेंशन के साथ फ़ाइल में कॉपी किया जाता है और फिर फ़ाइल का नाम उस निर्देशिका में .ignignore में जुड़ जाता है। इसलिए मैं एक फ़ाइल default_values.txt.basefile बनाऊंगा और यह प्रतिबद्ध करूंगा। मेरे पास ऐसा करने के लिए git या perl chops नहीं है, लेकिन मैं एक मित्र से पूछूंगा जो ऐसा करता है और आपको बताता है कि यह कैसे काम करता है।
मार्क

1
@AdamDymitruk: हां, इस मामले में क्लीन / स्मूदी का उपयोग किया जा सकता है, लेकिन यह स्पष्ट है कि यह सबसे अच्छा विकल्प है। उदाहरण के लिए, यह इसे और अधिक कठिन बना देगा यदि लोग वास्तव में फ़ाइल बदलना चाहते हैं , क्योंकि स्वच्छ / स्मूदी रास्ते में मिल जाएगी। मैं वास्तव में यहाँ वर्णित दृष्टिकोण को प्राथमिकता दूंगा।
साल्स्के

1
मैं स्वयं गिट (विशेषकर हुक हुक) से एक क्यू लेता हूं और .sampleप्रत्यय का उपयोग करता हूं । तो आपके मामले मेंdefault_values.txt.sample
tir38

5

स्मूदी / स्वच्छ पटकथा पर एक नज़र डालें। इस तरह से आप फ़ाइल को नियंत्रित कर सकते हैं, लेकिन जब इसकी जाँच की जाती है, तो आप फ़ाइल में मशीन के विशिष्ट डेटा के साथ सामान्य / स्थान-धारक डेटा को बदलकर इसे "स्मज" कर देंगे।

जब आप इसे प्रतिबद्ध करते हैं, तो आप मशीन को विशिष्ट जानकारी को सामान्य या स्थान-धारक की जानकारी से बदलकर "साफ" करेंगे।

स्मज / स्वच्छ लिपियों में नियतात्मक होना चाहिए कि उन्हें कई बार लागू करना, अलग-अलग क्रमों में अनुक्रम में पिछले एक को चलाने के बराबर होगा।

यदि आपको अपनी रिपॉजिटरी को उजागर करने की आवश्यकता है, तो पासवर्ड के साथ इसे लागू किया जा सकता है लेकिन सामग्री में संवेदनशील जानकारी हो सकती है।


क्या स्वच्छ और धुंधली स्क्रिप्ट स्थानीय या रेपो का हिस्सा हैं?
एलन

हाँ। :) ... यही है, आप रेपो के माध्यम से धब्बों को साफ कर सकते हैं लेकिन जब उत्पादन पासवर्ड जैसे संवेदनशील डेटा होते हैं तो यह एक अच्छा विचार नहीं है। यदि यह चिंता का विषय नहीं है, तो git को स्क्रिप्ट को स्पष्ट रूप से सक्षम करने की आवश्यकता होती है। अन्यथा, लोग अन्य उपयोगकर्ताओं के लिए गीथब और अन्य साझा किए गए भंडार के माध्यम से दुर्भावनापूर्ण काम कर सकते हैं।
एडम डिमिट्रुक

मुझे इसके बारे में थोड़ा और पढ़ने की जरूरत है। मूल रूप से मैं एक ऐसी परियोजना को स्थापित करना चाहता हूं जिसमें एक डिफ़ॉल्ट है user.jsonजिसे प्रत्येक डेवलपर्स क्रेडिट के साथ ओवरराइट करने की आवश्यकता है, लेकिन मैं नहीं चाहता कि देव गलती से अपने क्रेडेंशियल में जांचें।
एलन

मैं साफ सुथरा उदाहरण स्क्रिप्ट के लिए चारों ओर गूगल होगा। देखो क्या आता है। इसके अलावा, फ्रीनोड पर गिट irc रूम पर कूदें। आपको तुरंत मदद मिलेगी।
एडम डाइमिट्रुक

3

मैंने "क्लीन" फ़िल्टर को केवल इंडेक्स में फ़ाइल की सामग्री को कैट करने के लिए परिभाषित करके इसे हल किया है।

git show :path/to/myfile केवल निर्दिष्ट फ़ाइल के लिए अनुक्रमणिका की सामग्री को मुद्रित करना चाहिए, इसलिए हम उस स्क्रिप्ट का उपयोग कर सकते हैं जो सूचकांक में अछूती प्रतिलिपि के साथ काम करने वाली प्रति को बदलने के लिए है:

#! /bin/sh

git show :$1

संबंधित फ़ाइल के लिए "स्वच्छ" फ़िल्टर के रूप में सेट करें (यह मानकर कि आपने "त्याग_शेष" में रखा है))

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

दुर्भाग्य से मुझे यह एक से अधिक फ़ाइलों के लिए सामान्य बनाने का एक तरीका नहीं मिल सकता है, क्योंकि यह बताने का कोई तरीका नहीं है कि हम कौन सी फ़ाइल को साफ स्क्रिप्ट के अंदर से संसाधित कर रहे हैं। बेशक, आपको प्रत्येक फ़ाइल के लिए एक अलग फ़िल्टर नियम जोड़ने से रोकने के लिए कुछ भी नहीं है, लेकिन यह थोड़ा क्लॉडी है।


1

मुझे एक समाधान मिला जो मेरी टीम के लिए काम करता है। हम सहानुभूति के माध्यम से अपने githooks को साझा करते हैं और git में टेम्पलेट फ़ाइल जोड़ने के बाद मैंने एक प्री-कमिट हुक जोड़ा जो यह जाँचता है कि क्या टेम्पलेट फ़ाइल को संशोधित किया गया है और यदि ऐसा है तो git reset -- templatefile.txt। यदि यह एकमात्र बदली हुई फ़ाइल है तो मैं कमिट भी निरस्त कर देता हूँ।


-1

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


यह एक अच्छा विचार है, लेकिन फिर मुझे भी सिंगल फाइल रिपॉजिटरी को git सर्वर पर रखना होगा, जो कि इष्टतम से कम है, केवल इसलिए कि हम गिटब का उपयोग कर रहे हैं और रिपॉजिटरी की सीमित संख्या है।
मार्क

@Marc की नज़र Visual Studio Team Services, अनलिमिटेड फ्री प्राइवेट प्रोजेक्ट्स और git रिपॉजिटरी पर है। कंबन बोर्ड, कार्य आइटम और बग ट्रैकिंग, कार्य आइटम के साथ सहयोगी चेकइन, स्प्रिंट या अन्य प्रोजेक्ट प्रकारों में स्प्रिंट का प्रबंधन करते हैं। साथ ही साथ इसके पास कई प्लेटफार्मों के खिलाफ निर्माण के लिए उत्कृष्ट बिल्ड टूल हैं, बहुत सी चीजों का उल्लेख करने के लिए जो सभी मुफ्त हैं। कुछ लोग इसे इसलिए दबाते हैं क्योंकि इसका Microsoft लेकिन यह हाथ मारता है कि गीथूब को सिर्फ रिपॉजिटरी होस्टिंग के अलावा टूल के मामले में क्या ऑफर करना है। आप मुफ्त में क्या कर सकते हैं, इसकी सीमाएं हैं लेकिन मैं शायद ही कभी उनसे अधिक हूं।
अरन मुलहोलैंड

@ मेरी एक और चीज़ जो मुझे वास्तव में बहुत अच्छी लगती है, वह यह है कि मैं जितने चाहें उतने खाते सेट कर सकता हूं, इसलिए यदि मैं एक क्लाइंट के लिए एक प्रोजेक्ट लिख रहा हूं, जो स्रोत नियंत्रण का मालिक बनना चाहता है, तो मैं इसका उपयोग कर सकता हूं परियोजना की योजना, डिजाइन और क्रियान्वित करने के लिए और जब मैं समाप्त हो जाता हूं तो मैं ग्राहक को खाते का स्वामित्व दे सकता हूं।
अरन मुलहोलैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.