`.Gitattributes` फ़ाइल में` टेक्स्ट = ऑटो` का उद्देश्य क्या है?


जवाबों:


77

से डॉक्स :

प्रत्येक पंक्ति .gitattributes(या .git/info/attributes) फ़ाइल फॉर्म की है:

pattern attr1 attr2 ...

तो यहाँ, पैटर्न है *, जिसका अर्थ है सभी फाइलें, और विशेषता है text=auto

क्या करता text=autoहै? प्रलेखन से:

जब पाठ को "ऑटो" पर सेट किया जाता है, तो पथ को स्वचालित एंड-ऑफ-लाइन सामान्यीकरण के लिए चिह्नित किया जाता है। यदि गिट निर्णय लेता है कि सामग्री पाठ है, तो इसकी लाइन अंत चेकइन पर LF के लिए सामान्यीकृत है।

यदि यह सक्षम नहीं है तो डिफ़ॉल्ट व्यवहार क्या है?

अनिर्दिष्ट

यदि पाठ विशेषता अनिर्दिष्ट है, तो फ़ाइल को परिवर्तित किया जाना चाहिए यह निर्धारित करने के लिए Git core.autocrlf कॉन्फ़िगरेशन चर का उपयोग करता है।

क्या करता core.autocrlfहै? डॉक्स से:

   core.autocrlf

इस चर को "सत्य" पर सेट करना लगभग सभी फ़ाइलों पर "ऑटो" को पाठ विशेषता सेट करने के समान है, सिवाय इसके कि पाठ फ़ाइलों को सामान्य करने की गारंटी नहीं है: रिपॉजिटरी में CRLF युक्त फ़ाइलों को छुआ नहीं जाएगा। यदि आप अपनी कार्यशील निर्देशिका में CRLF लाइन एंडिंग करना चाहते हैं, तो भी इस सेटिंग का उपयोग करें, भले ही रिपॉजिटरी में सामान्यीकृत लाइन एंडिंग्स न हों। इस चर को इनपुट पर सेट किया जा सकता है, जिस स्थिति में कोई आउटपुट रूपांतरण नहीं किया जाता है।

यदि आपको लगता है कि यह सब कीचड़ के रूप में स्पष्ट है, तो आप अकेले नहीं हैं।

यहाँ * text=autoमेरे शब्दों में क्या है: जब कोई फ़ाइल करता है, तो Git यह अनुमान लगाता है कि वह फ़ाइल एक टेक्स्ट फ़ाइल है या नहीं, और यदि यह है, तो यह फ़ाइल का एक संस्करण बना देगा जहाँ सभी CR + LF बाइट्स को LF बाइट्स से बदल दिया जाता है। यह सीधे प्रभावित नहीं करता है कि काम करने वाले पेड़ में कौन सी फाइलें दिखती हैं, ऐसी अन्य सेटिंग्स हैं जो एक फ़ाइल की जांच करते समय LF बाइट्स को CR + LF बाइट में बदल देती हैं।

सिफ़ारिश करना:

मैं फ़ाइल में डालने की सलाह नहीं दूंगा । इसके बजाय, मैं कुछ इस तरह की सिफारिश करेंगे:* text=auto.gitattributes

*.txt text
*.html text
*.css text
*.js text

यह स्पष्ट रूप से निर्दिष्ट करता है कि कौन सी फाइलें पाठ फाइलें हैं, जो वस्तु डेटाबेस में CRLF को LF में परिवर्तित कर देती हैं (लेकिन आवश्यक रूप से कार्यशील पेड़ में नहीं)। हमारे पास एक रेपो था * text=auto, और Git ने एक छवि फ़ाइल के लिए गलत अनुमान लगाया कि यह एक पाठ फ़ाइल थी, जिससे इसे भ्रष्ट करने के लिए इसे ऑब्जेक्ट डेटाबेस में LF बाइट्स के साथ CR + LF बाइट्स से बदल दिया गया। यह डिबग करने के लिए एक मजेदार नहीं था।

यदि आप उपयोग करना चाहते हैं * text=auto, तो इसे पहली पंक्ति के रूप में डालें .gitattributes, ताकि बाद की पंक्तियाँ इसे ओवरराइड कर सकें। यह एक तेजी से लोकप्रिय अभ्यास बनता जा रहा है।


2
हर कोई LF को नॉर्मल नहीं बल्कि CRLF क्यों कहता है? क्या इसे साबित करने के लिए कोई रेफरी है?
योषा अलाय्यूब

1
@YoushaAleayoub क्या मतलब है?
फ्लिम्स

1
@YoushaAleayoub यदि आपका everyoneसंदर्भ है git-scm, तो यह संभवतः इसलिए है क्योंकि वे एक * nix पैकेज विकसित कर रहे हैं और इस प्रकार * nix newline वर्ण का उपयोग करना सामान्य है
जस्टिन मोह

4
@YoushaAleayoub LF को "सामान्य" माना जाता है b / c यह कई देव साधनों में आम है। लोकप्रिय देव उपकरण जैसे git-scm* निक्स। MacOS LF का उपयोग करता है। केवल विंडोज (केवल मुख्य धारा ओएस पर विचार) CRLF का उपयोग कर रहा है। यह विंडोज़ पर * निक्स टूल्स का उपयोग करने वाले और फ़ाइलों के आदान-प्रदान के समय सभी के लिए कठिन हो जाता है। यह भी देखें कि सीआरएलएफ क्यों
रूई दांतों

2
@, क्या आप *.txt text=autoऔर *.txt textकृपया के बीच का अंतर समझा सकते हैं ? मुझे लगा कि आपके उदाहरण के ऊपर की सभी 4 पंक्तियाँ फ़ाइल एक्सटेंशन के text=autoठीक textबाद की होनी चाहिए । उदाहरण के लिए KiCad पदचिह्न फ़ाइलें (".kicad_mod" एक्सटेंशन), ​​उनके gitattributes फ़ाइल में इस लाइन का उपयोग करके सामान्यीकृत की जाती हैं: *.kicad_mod text=auto( kicad-pcb.org/lbooks/klc/G1.7 )।
गेब्रियल स्टेपल्स

64

यह सुनिश्चित करता है कि लाइन एंडिंग सामान्यीकृत हो। स्रोत: कर्नेल

जब पाठ को "ऑटो" पर सेट किया जाता है, तो पथ को स्वचालित एंड-ऑफ-लाइन सामान्यीकरण के लिए चिह्नित किया जाता है। यदि गिट निर्णय लेता है कि सामग्री पाठ है, तो इसकी लाइन अंत चेकइन पर LF के लिए सामान्यीकृत है।

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

यह सुनिश्चित करता है कि सभी फाइलें जो गिट को टेक्स्ट मानती हैं, रिपॉजिटरी में सामान्यीकृत (LF) लाइन एंडिंग्स होंगी।


12
सामान्यीकृत लाइन समाप्त होने से आपका क्या मतलब है?
Fizer Khan

14
When a text file is normalized, its line endings are converted to LF in the repository.
डेव ज़िक

11
यह जानना महत्वपूर्ण है, यह आपकी मशीन पर स्थानीय core.autocrlf सेटिंग को ओवरराइट करता है @Daniel Jomphe
spankmaster79

1
यह बहुत अच्छा होगा अगर गिट बस $% # नहीं था किसी भी फाइल को रिपॉजिटरी में चेक करने के लिए। मैंने SLM, PerForce, MsBuild, Source Depot, TFS, SVM के साथ काम किया है, इनमें से कोई भी आपकी किसी भी फाइल में एक बाइट को नहीं बदलेगा। यह एक बेहूदा गिट हैक IMO है और इससे मुझे बहुत दर्द होता है।
वेंस मैककॉर्ले

1
चेकआउट पर क्या होता है, यह केवल आधी कहानी है - क्या होता है? क्या यह कहना सही होगा कि चेकआउट पर, लाइन एंडिंग LF, खिड़कियों पर भी रहती है?
एंथनी

8

यह कॉन्फ़िगरेशन इस बात से संबंधित है कि लाइन एंडिंग को कैसे हैंडल किया जाता है। जब सक्षम किया जाता है, तो सभी पंक्ति अंत को रिपॉजिटरी में LF में बदल दिया जाता है। आपके कार्य निर्देशिका में लाइन अंत कैसे परिवर्तित किए जाते हैं, इससे निपटने के लिए अन्य झंडे हैं। इस मुद्दे पर पूरी जानकारी हमें यहाँ दें: https://www.kernel.org/pub/software/scm/git/docs/Itetributing.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.