फ़ाइल को Git रेपो में रखें, लेकिन परिवर्तनों को ट्रैक न करें


305

मेरे पास एक CodeIgniter साइट में कई फाइलें हैं जिन्हें मैं रेपो में रखना चाहता हूं, लेकिन किसी भी बदलाव को ट्रैक नहीं कर सकता।

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

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

वर्तमान में अगर मैं चला

git clone git@github.com:user123/myRepo.git httpdocs

और फिर ऊपर की फ़ाइलों को संपादित करें, सब बहुत अच्छा है। जब तक मैं एक हॉटफ़िक्स या पैच जारी नहीं करता और चलाता हूँ git pull। मेरे सभी परिवर्तन तब अधिलेखित कर दिए गए हैं।





आप ग्राहक क्रेडेंशियल / कॉन्फ़िगरेशन फ़ाइलों को अनदेखा कर सकते हैं और प्रोग्राम को डिफ़ॉल्ट फ़ाइलों का निर्माण कर सकते हैं यदि वे रेपो स्थापित होने पर गायब हैं?
मैथ्यू

जवाबों:


618

इसे करने के लिए git का एक अलग समाधान है। पहले उस फ़ाइल को बदलें जिसे आप ट्रैक नहीं करना चाहते हैं और निम्नलिखित कमांड का उपयोग करें:

git update-index --assume-unchanged FILE_NAME

और यदि आप परिवर्तनों को फिर से ट्रैक करना चाहते हैं तो इस कमांड का उपयोग करें:

git update-index --no-assume-unchanged FILE_NAME

git-update-index प्रलेखन


मैंने वही किया जो आप कहते हैं, लेकिन git स्टेटस बताता रहता है कि फाइल संशोधित है
rrallvv

7
हाँ, यह "स्वीकृत उत्तर" होना चाहिए। मेरे लिए काम किया।
joshmcode

34
जूनियो हमानो (गिट का अनुचर) के अनुसार: "मान लें कि किसी अपरिचित तंत्र के साथ दुर्व्यवहार नहीं किया जाना चाहिए। [...] यह गीट का एक वादा नहीं है कि गिट हमेशा इन रास्तों पर विचार करेंगे। एक पथ को निर्धारित कर सकते हैं जो मान लिया गया है कि अपरिवर्तित, अतिरिक्त lstat (2) लागत के बिना बदल गया है, यह रिपोर्ट करने का अधिकार सुरक्षित रखता है कि पथ को संशोधित किया गया है (परिणामस्वरूप, "git प्रतिबद्ध -a" वह करने के लिए स्वतंत्र है परिवर्तन)।" दूसरे शब्दों में, मान-अपरिवर्तित केवल स्थानीय प्रदर्शन मुद्दों के लिए है। यदि गिट यह निर्धारित कर सकता है कि उन फ़ाइलों को हल्के तरीके से बदल दिया गया है, तो यह होगा।
अलेजांद्रो गार्सिया इग्लेसियस

41
इसके लिए जानकारी पढ़ना, मुझे लगता है कि --skip-worktreeविकल्प इस नौकरी के लिए बेहतर अनुकूल है --assume-unchanged
PJSCopeland

26
--स्किप-वर्कट्री वास्तव में बेहतर विकल्प है। अधिक जानकारी: stackoverflow.com/questions/13630849/…
कस्टमाइज़र

80

एक उत्तर को दूसरे उत्तर की टिप्पणियों से बाहर निकालने के लिए:

$ git update-index --skip-worktree FILENAME

से बेहतर विकल्प प्रतीत होता है --assume-unchanged

इसके बारे में यहां और अधिक पढ़ा जा सकता है: Git - अंतर के बीच 'ग्रहण-अपरिवर्तित' और 'स्किप-वर्कट्री'



जब मैं ऐसा करता हूं और फिर शाखाएं बदलने की कोशिश करता हूं, तो मुझे "अनुपयोगी कार्यशील ट्री फ़ाइलों को चेकआउट द्वारा अधिलेखित कर दिया जाएगा ... कृपया शाखाओं को स्विच करने से पहले उन्हें स्थानांतरित या हटा दें"। किसी भी विचार से कैसे बचें?
पैट्रिक सज़ालापस्की

@Aexl द्वारा संदर्भित लेख संकलित
एंड्रयू केटोन

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

58

मेरे कोड इग्नाइटर प्रोजेक्ट्स के लिए, मैं डेटाबेस . php.example और config.php.example को रेपो में रखता हूं ।

तब मैं जोड़ने config.php और अनुप्रयोगों / config / database.php को .gitignore फ़ाइल।

इसलिए, अंत में, जब मैं तैनात होता हूं, तो मैं .example फ़ाइलों (config.php और database.php पर) कॉपी कर सकता हूं, उन्हें अनुकूलित कर सकता हूं, और वे GIT द्वारा ट्रैक नहीं किए जाएंगे।


12
अच्छा समाधान है, लेकिन मुझे लगता है कि नासिरखान का जवाब सबसे अच्छा है।
शब्दफिरवाइज़

यह एक अच्छा उपाय नहीं है। यदि आप अपने git इंडेक्स को फ्लश करते हैं, तो जब आप मतलब नहीं रखते हैं तो आप परिवर्तनों को ट्रैक करना शुरू करेंगे। ऐसा करने के सही तरीके के लिए @nasirkhans उत्तर देखें।
ब्रायन मेल्टन-ग्रेस - MSFT

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

1
अगर यह gitignore में है तो यह फिर से ट्रैकिंग परिवर्तन क्यों शुरू करेगा
Shapeshifter

ओपी की समस्या का समाधान करता है लेकिन वास्तव में इस सवाल का जवाब नहीं देता है।
ट्रैविस विल्सन

1

मैं उन्हें आपकी .gitignoreफ़ाइल में डाल दूंगा और उन्हें आवश्यकतानुसार मैन्युअल रूप से कॉपी करूंगा।

तो कंकाल फ़ाइल नाम git में होगा, अनदेखा फ़ाइल नाम git में नहीं होगा (लेकिन .ignignore में होगा)। इस तरह, जब उन्हें 'टेम्पलेट' ('कंकाल से बेहतर नाम) से' वास्तविक 'में कॉपी करने के लिए मैनुअल कदम उठाया जाता है, तो उन्हें तुरंत नजरअंदाज कर दिया जाता है।


1
पहले रेपो में उन्हें जोड़ने के लिए कोई रास्ता नहीं है, और फिर उन्हें .gitignore में जोड़ने के लिए? यह बहुत अच्छा होगा अगर इसमें फ़ाइलों को शामिल करने के लिए एक समाधान था लेकिन एक निश्चित प्रतिबद्ध या कुछ के बाद कोई बदलाव नहीं।
गोरक्षक

1
@mklauber मैं उन्हें अनिश्चित काल तक चलाना चाहता हूं जब तक कि मैं दौड़ न लूं git rm <file>। उद्देश्य IE: एक config.php फ़ाइल है। मैं कॉन्फिग फाइल रखना चाहता हूं, लेकिन मैं स्पष्ट रूप से डेटाबेस क्रेडेंशियल्स को क्लाइंट से क्लाइंट तक ट्रैक नहीं करना चाहता क्योंकि वे अलग हैं।
गोरलेटिव

1
हाँ, हमारे पास हमारे रेल डेटाबेस के साथ समस्या है। फाइल। हम एक कंकाल रखते हैं और फिर इसे कॉपी और बदलते हैं।
माइकल डुरंट

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

10
आपके पास ये दो विकल्प हैं: फ़ाइल को इसमें जोड़ें git add file1और फिर अपनी .gitignoreफ़ाइल को संपादित करें । कमिट की गई फ़ाइल वहीं रहेगी और अपडेट नहीं की जाएगी। या: आप फ़ाइल को इसमें जोड़ सकते हैं .gitignoreऔर फिर इसे git add --force file1फ़ाइल के साथ जोड़ने के लिए जोड़ सकते हैं। जब भी आपको फ़ाइल को ओवरराइट करना हो तो आप 2 ऑप्शन का उपयोग कर सकते हैं
klaustopher

1

दिए गए उत्तर समस्या को आंशिक रूप से हल कर रहे हैं, लेकिन और भी अधिक समस्याओं का परिचय दे रहे हैं।

मुझे "Web.Local.config" फ़ाइल को संरक्षित करने की आवश्यकता थी। एकमात्र समाधान जो मेरे लिए काम करता था:

1. प्रोजेक्ट से फ़ाइल को बाहर करें

2. Web.LocalTemplate.config के रूप में फ़ाइल की एक अलग प्रतिलिपि बनाएँ

अब जब "Web.LocalTemplate.config" को Git द्वारा ट्रैक किया जाता है, तो सभी डेवलपर्स इसे एक प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं। हालांकि, "Web.Local.config", परियोजना का हिस्सा नहीं होने को स्वचालित रूप से अनदेखा किया जाएगा।


git update-index --skip-worktree FILENAMEकेवल आपकी समस्या को आंशिक रूप से कैसे हल किया जा रहा है, या अधिक समस्याओं को भी जोड़ा जा रहा है ?? यह वही करता है जो आप करना चाह रहे हैं। क्या तुमने कोशिश की?
आमिर असरफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.