2014-05-23 6 views
8

यह प्रश्न संबंधित से संबंधित प्रश्नों के लिए है: https://stackoverflow.com/search?q=[git]+%2Bassume-unchanged, हालांकि, इन सवालों के दिए गए उत्तरों में से कोई भी मेरी आवश्यकताओं को पूरा नहीं कर रहा है।क्या .gitignore संस्करण नियंत्रित फ़ाइलों के बराबर है?

मेरे पास एक हेडर फ़ाइल (key_info.h) है जो एक पायथन स्क्रिप्ट द्वारा उत्पन्न होती है। चतुर होने के लिए, मैं संस्करण हैडर (key_info.h) की एक प्लेसहोल्डर संस्करण नियंत्रित कोड की एक लाइन के साथ:

int i = you_need_to_run_the_key_info_gen_python_script_to_generate_this_file(); 

पहले अजगर स्क्रिप्ट चलाने, इस कोड संकलन बिल्कुल डेवलपर कह एक त्रुटि निकलेगा को क्या करें; स्क्रिप्ट चलाओ।

स्वाभाविक रूप से, डेवलपर key_info.h का नवीनतम संस्करण उत्पन्न करने के लिए पायथन स्क्रिप्ट चलाकर आगे बढ़ेगा और कोड सफलतापूर्वक संकलित होगा। डेवलपर फिर बदलावों की एक श्रृंखला बनाने के लिए आगे बढ़ेगा और फिर उनके कोड को 'गिट प्रतिबद्ध' करेगा।

हम जिस समस्या को चलाते हैं वह यह तथ्य है कि key_info.h अब संशोधित किया गया है। इस प्रकार, गिट इसे एक संशोधन के रूप में उठाएगा और इसे प्रतिबद्ध करने की अनुमति देगा। हालांकि, इस हेडर के जेनरेट किए गए संस्करण को संस्करण नियंत्रित नहीं किया जाना चाहिए। डेवलपर्स को संकलन त्रुटि संकेत प्रदान करने के लिए हमें अपरिवर्तित रहने के लिए प्लेसहोल्डर संस्करण की आवश्यकता है।

मेरी पहली प्रवृत्ति गिट को key_info.h को एक प्रतिबद्धता में लेने से रोकने के लिए .gitignore का उपयोग करना था। .gitignore तब डेवलपर्स के बीच आसानी से साझा किया जाता है .gitignore स्वयं संस्करण नियंत्रित है। दुर्भाग्यवश, .gitignore केवल उन फ़ाइलों के लिए काम करता है जो संस्करण नियंत्रित नहीं हैं।

मेरा अगला विचार 'गिट अपडेट-इंडेक्स --assume-unchanged/path/to/file' का उपयोग करना था। यह स्थानीय स्तर पर बहुत अच्छा काम करता है, लेकिन मेरे पास अन्य डेवलपर्स पर इस नियम को लागू करने का कोई तरीका नहीं है। देवता गलती से जेनरेट किए गए हेडर को करने से पहले ही समय की बात है।

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

+1

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

उत्तर

3

लेकिन मैं अन्य डेवलपर्स

पर इस नियम को लागू करने का कोई तरीका नहीं आप करते हैं, लगभग: यदि आप अपने की-जानकारी पीढ़ी स्क्रिप्ट चलाने git update-index --assume-unchanged /some/path बना सकता है।

लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है।

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

1

यह अच्छा काम करता है स्थानीय स्तर पर है, लेकिन मैं अन्य डेवलपर्स

अन्य तरीके से, एक सामग्री फ़िल्टर ड्राइवर जायें जो कि घोषित करने के लिए git add पर, स्वचालित रूप से करने के लिए अपने फ़ाइल को पुनर्स्थापित है पर इस नियम को लागू करने का कोई तरीका नहीं उपयुक्त सामग्री।

http://git-scm.com/figures/18333fig0703-tn.png

(Pro Git book 7.2 Customizing Git - Git Attributes से)

आप स्टोर कर सकते हैं और साझा करें:

  • एक .gitattributes file में फिल्टर की घोषणा।
  • 'clean' स्क्रिप्ट जो सामग्री

पुनर्स्थापित कर देगा लेकिन: प्रत्येक उपयोगकर्ता अभी भी अपने स्थानीय config में है कि फिल्टर रजिस्टर करना होगा:

git config filter.<filtername>.clean ./<filterscript> 

तो वहाँ कोई सार्वभौमिक तरह से करने के लिए है " एक संस्करण वाली फ़ाइल को अनदेखा करें, प्रत्येक रेपो में केवल स्थानीय समाधान लागू किया जाए।


उन्हीं फिल्टर आप मदद कर सकते हैं:

  • संस्करण एक key_info.h.tpl
  • चेकआउट (धब्बा स्क्रिप्ट) एक key_info.h पर उत्पन्न जो निजी रहता है

आप डॉन ' टी को हमेशा एक स्क्रिप्ट स्टोर नहीं करना पड़ता है, क्योंकि यह फ़िल्टर घोषणा एनल में हो सकता है च, jthill टिप्पणी below के रूप में:

इस के लिए

, 1.8.5 के बाद से फिल्टर पथ नाम मिलता है और आप फिल्टर सेटअप आत्म निहित कर सकते हैं।

उदाहरण के लिए:

git config filter.pin-content.clean 'git show HEAD:%f 2>&- || cat' 
git config filter.pin-content.smudge 'cat %f 2>&- || cat' 

कि गंतव्य सामग्री यदि कोई किसी और का इस्तेमाल किया क्या आपूर्ति की है सुरक्षित करेगा। तब
:

  • echo anypatternyoulike filter=pin-content >>.git/info/attributes फिल्टर स्थानीय बनाने के लिए, या
  • ...>>.gitattributes यह वैश्विक बनाने के लिए।
+0

नोट: इसके लिए, 1.8.5 फ़िल्टरों को पथनाम मिलता है और आप फ़िल्टर सेटअप को स्वयं निहित कर सकते हैं, उदाहरण के लिए 'गिट कॉन्फ़िगरेशन फ़िल्टर.pin-content.clean' git show HEAD:% f 2> & - | | cat'' और 'git config filter.pin-content.smudge 'cat% f 2> & - || cat'' जो गंतव्य सामग्री को संरक्षित रखेगा यदि किसी और ने जो आपूर्ति की है उसका उपयोग किया जाता है। फिर फ़िल्टर को स्थानीय बनाने के लिए anyitternyoulike फ़िल्टर = पिन-सामग्री >> गिट/जानकारी/विशेषताओं 'को प्रतिबिंबित करें, या' ... gitattributes' इसे वैश्विक बनाने के लिए। – jthill

+0

@jthill अच्छा बिंदु। मैंने इसे अधिक दृश्यता के उत्तर में शामिल किया है। – VonC

3

कुछ विकल्प, रैंक और tl, कुछ पुरुष द्वारा dr'd आप कभी नहीं मिले:

  • सबसे अच्छा यह करने के लिए जिस तरह से बस पर फ़ाइल को ट्रैक नहीं करने के लिए है सब, क्योंकि आपके पास एक मेकफ़ाइल लक्ष्य है। यदि आप make नहीं प्राप्त कर सकते हैं या नहीं चाहते हैं ... अच्छा, कोई भी आईडीई व्यंजनों को कॉन्फ़िगर कर सकता है, है ना?

    @hvd has the best version of this one, मैंने इसे पहले याद किया: जेनरेटेड generated-headers निर्देशिका में जेनरेट किए गए शीर्षलेख डालें, आपको पहले अपना खोज करने के लिए अपना कंपाइलर मिलता है, और डिफ़ॉल्ट को बैकअप के रूप में रखें।

  • यदि आपकी बिल्ड प्रक्रिया उसमें सक्षम नहीं है, तो अगला सबसे अच्छा the filter method @VonC describes है, क्योंकि यह अस्थायी रूप से ऐसी शाखा की जांच करने के खिलाफ मजबूत है जिसमें फ़ाइल नहीं है। tl; फ़िल्टर पर डॉ है "की रक्षा क्या है":

    git config filter.pin-content.clean 'git show HEAD:%f 2>&- || cat' 
    git config filter.pin-content.smudge 'cat %f   2>&- || cat' 
    
    echo anypatternyouwant filter=pin-content >>.gitattributes # tracked, global 
    echo anypatternyouwant filter=pin-content >>.git/info/attributes # local-only 
    

    नोट में अच्छी तरह से:git will silently ignore filters that aren't configured, तो एक फ़ाइल एक ट्रैक किए गए विशेषता काम करेंगे दे रही है, यह दूसरों पर कोई असर नहीं होगा, जब तक वे यह चाहते सेवा मेरे।

  • अगला सबसे अच्छा विहित विधि, बहुत आसान लागू करने के लिए है और इतने लंबे समय के रूप में फ़ाइल सभी शाखाओं पर ट्रैक किया जाता है एक इलाज काम करता है:

    git update-index --assume-unchanged key_info.h 
    

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

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