--- अद्यतन 3 --- (अद्यतन 2 के साथ संघर्ष नहीं करता है)
इस मामले को ध्यान में रखते हुए कि विंडोज़ उपयोगकर्ता काम करना पसंद करते हैं CRLFऔर लिनक्स / मैक उपयोगकर्ता LFपाठ फ़ाइलों पर काम करना पसंद करते हैं । रिपॉजिटरी मेंटेनर के दृष्टिकोण से उत्तर प्रदान करना :
मेरे लिए सबसे अच्छी रणनीति (हल करने के लिए कम समस्याएं) है: सभी पाठ फ़ाइलों को LFgit repo के अंदर रखें, भले ही आप केवल विंडोज प्रोजेक्ट पर काम कर रहे हों। फिर ग्राहकों को उनकी पसंद की लाइन-एंडिंग शैली पर काम करने की स्वतंत्रता दें , बशर्ते कि वे एक core.autocrlfसंपत्ति मूल्य चुनें जो आपकी रणनीति का सम्मान करेंगे (रेपो पर एलएफ) जबकि प्रतिबद्ध के लिए फाइल का मंचन करते हैं।
स्टेजिंग वह है जिसे समझने की कोशिश करते समय कितने लोग भ्रमित होते हैं कि न्यूलाइन रणनीतियां कैसे काम करती हैं। core.autocrlfसंपत्ति के लिए सही मूल्य चुनने से पहले निम्नलिखित बिंदुओं को कम करना आवश्यक है :
- कमिट के लिए एक टेक्स्ट फ़ाइल जोड़ना ( इसे स्टेज करना) कनवर्ट की गई लाइन-एंडिंग ( आपके क्लाइंट कॉन्फिगर पर मूल्य के आधार पर ) के साथ सब-डायरेक्टरी के अंदर फाइल को दूसरी जगह कॉपी करने जैसा है । यह सब स्थानीय स्तर पर किया जाता है।
.git/core.autocrlf
- सेटिंग प्रश्न का उत्तर
core.autocrlf प्रदान करने जैसा है (सभी OS पर सटीक प्रश्न):
- "चाहिए Git-ग्राहक एक। कन्वर्ट वामो करने वाली CRLF जब जाँच-आउट (खींच) रिमोट से रेपो परिवर्तन या ख। धर्मांतरित CRLF करने वाली वामो जब एक फ़ाइल जोड़ने के लिए प्रतिबद्ध के लिए? " और संभव जवाब (मान) इस प्रकार हैं:
false:" ऐसा कोई भी ऊपर के ",
input:" करते हैं केवल ख "
true: " ऐसा एक और और ख "
- ध्यान दें कि कोई " नहीं है "
भाग्यवश
- git क्लाइंट डिफॉल्ट्स (विंडोज़:,
core.autocrlf: truelinux / mac
:) एलएफ-ओनली-रेपो रणनीति के core.autocrlf: falseअनुकूल होगा । अर्थ : विंडोज़ ग्राहक डिफ़ॉल्ट रूप से CRLF में कनवर्ट करते हैं, जब रिपॉजिटरी की जाँच करते हैं और प्रतिबद्ध होने पर LF में परिवर्तित होते हैं। और लिनक्स क्लाइंट डिफ़ॉल्ट रूप से कोई भी रूपांतरण नहीं करेंगे। यह सैद्धांतिक रूप से आपके रेपो को केवल एलएफ बनाए रखता है।
दुर्भाग्य से:
- GUI क्लाइंट हो सकते हैं जो git
core.autocrlfमान का सम्मान नहीं करते हैं
- ऐसे लोग हो सकते हैं जो आपकी lf-repo रणनीति का सम्मान करने के लिए किसी मूल्य का उपयोग नहीं करते हैं। जैसे वे उपयोग करते हैं
core.autocrlf=falseऔर प्रतिबद्ध के लिए CRLF के साथ एक फ़ाइल जोड़ते हैं।
उपरोक्त ग्राहकों द्वारा किए गए ASAP गैर- lf पाठ फ़ाइलों का पता लगाने के लिए आप क्या वर्णित है पर अनुसरण कर सकते हैं --- अद्यतन 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEADएक ग्राहक द्वारा उपयोग किए गए संकलित करें: --with-libpcreध्वज)
और यहाँ पकड़ है :। मैं एक रेपो मेंटेनर के रूप में रखता git.autocrlf=inputहूं ताकि मैं किसी भी गलत तरीके से प्रतिबद्ध फाइलों को फिर से कमिट के लिए जोड़कर ठीक कर सकूं। और मैं एक प्रतिबद्ध पाठ प्रदान करता हूं: "गलत तरीके से किए गए फ़ाइलों को ठीक करना"।
जहां तक .gitattributesसहमति है। मैं इस पर भरोसा नहीं करता हूं, क्योंकि अधिक यूआई क्लाइंट हैं जो इसे नहीं समझते हैं। मैं केवल पाठ और बाइनरी फ़ाइलों के लिए संकेत प्रदान करने के लिए इसका उपयोग करता हूं, और शायद कुछ असाधारण फ़ाइलों को चिह्नित करता हूं जो हर जगह समान लाइन-एंडिंग रखना चाहिए:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
प्रश्न: लेकिन न्यूलाइन हैंडलिंग की रणनीति में हम क्यों दिलचस्पी रखते हैं?
उत्तर: एकल अक्षर परिवर्तन से बचने के लिए, 5000-लाइन परिवर्तन के रूप में दिखाई दें , सिर्फ इसलिए कि जिस ग्राहक ने परिवर्तन को स्वचालित रूप से परिवर्तित किया है, वह पूर्ण फाइल को क्रिप्ट से lf (या विपरीत) के लिए प्रतिबद्ध करने से पहले जोड़ देता है। यह बल्कि दर्दनाक हो सकता है जब कोई संघर्ष संकल्प शामिल हो। या यह कुछ मामलों में अनुचित विवाद का कारण हो सकता है।
--- अद्यतन 2 ---
अधिकांश मामलों में git क्लाइंट के dafaults काम करेंगे। भले ही आपके पास केवल क्लाइंट्स हों, linux केवल क्लाइंट्स हों या दोनों। य़े हैं:
- विंडोज़: का
core.autocrlf=true अर्थ है चेकआउट पर CRLF में लाइनों को कनवर्ट करें और फ़ाइलों को जोड़ते समय लाइनों को LF में कनवर्ट करें।
- linux: का
core.autocrlf=input अर्थ है चेकआउट पर लाइनों को परिवर्तित न करना (कोई ज़रूरत नहीं है क्योंकि फ़ाइलों के LF के साथ प्रतिबद्ध होने की उम्मीद है) और फ़ाइलों को जोड़ते समय लाइनों को LF (यदि आवश्यक हो) में परिवर्तित करें। ( - अपडेट 3 - : लगता है कि यह falseडिफ़ॉल्ट रूप से है, लेकिन फिर से यह ठीक है)
संपत्ति को अलग-अलग स्कोप में सेट किया जा सकता है। मैं --globalअंत में वर्णित कुछ IDE मुद्दों से बचने के लिए, गुंजाइश में स्पष्ट रूप से सेटिंग करने का सुझाव दूंगा ।
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
इसके अलावा, मैं दृढ़ता से खिड़कियों पर प्रयोग को हतोत्साहित करूँगा (यदि आपके पास केवल ग्राहक हैं) तो इसके विपरीत जो दस्तावेज प्रस्तुत करने का प्रस्ताव है । झूठी में सेट करना रेपो में CRLF के साथ फाइल करेगा। लेकिन वास्तव में कोई कारण नहीं है। आपको कभी नहीं पता कि आपको लिनक्स उपयोगकर्ताओं के साथ परियोजना साझा करने की आवश्यकता होगी या नहीं। इसके अलावा यह प्रत्येक क्लाइंट के लिए एक अतिरिक्त कदम है जो चूक का उपयोग करने के बजाय परियोजना में शामिल होता है। git config --global core.autocrlf false
अब फ़ाइलों के कुछ विशेष मामलों के लिए (उदाहरण के लिए *.bat *.sh) जो आप चाहते हैं कि उन्हें LF के साथ या CRLF के साथ चेक-आउट किया जा सके.gitattributes
मेरे लिए सबसे अच्छा अभ्यास है:
- सुनिश्चित करें कि हर गैर-बाइनरी फ़ाइल गिट रेपो (डिफ़ॉल्ट व्यवहार) पर एलएफ के साथ प्रतिबद्ध है।
- इस आदेश का उपयोग यह सुनिश्चित करने के लिए करें कि CRLF के साथ कोई भी फ़ाइल प्रतिबद्ध नहीं है:
git grep -I --files-with-matches --perl-regexp '\r' HEAD( नोट: विंडोज़ क्लाइंट केवल git-bashलिनक्स क्लाइंट्स के माध्यम से और उसके बाद ही काम करता है, यदि उनका उपयोग करके संकलित किया --with-libpcreगया हो ./configure)।
- यदि आप उपरोक्त कमांड को निष्पादित करके ऐसी कोई भी फाइल ढूंढते हैं, तो उन्हें सही करें। इसमें शामिल है (कम से कम लिनक्स पर):
- सेट
core.autocrlf=input( --- अद्यतन 3 - )
- फ़ाइल बदलें
- परिवर्तन को वापस लाएं (फ़ाइल को अभी भी बदला हुआ दिखाया गया है)
- इसे कमिट करें
- केवल नंगे न्यूनतम का उपयोग करें
.gitattributes
- उपयोगकर्ताओं
core.autocrlfको इसके डिफ़ॉल्ट मानों के ऊपर वर्णित सेट करने का निर्देश दें ।
- की उपस्थिति पर 100% मत गिनो
.gitattributes। IDEs के git-क्लाइंट उन्हें अनदेखा कर सकते हैं या उनके साथ भिन्न व्यवहार कर सकते हैं।
जैसा कि कहा गया है कि कुछ चीजें गिट विशेषताओं में जोड़ी जा सकती हैं:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
मुझे लगता है कि .gitattributesबाइनरी फ़ाइलों के लिए ऑटो-डिटेक्शन का उपयोग करने के बजाय कुछ अन्य सुरक्षित विकल्प :
-text(उदाहरण के लिए *.zipया *.jpgफ़ाइल्स: पाठ के रूप में नहीं माने जाएंगे। इस प्रकार कोई भी लाइन-एंड रूपांतरणों का प्रयास नहीं किया जाएगा। रूपांतरण के बिना रूपांतरण संभव हो सकता है)
text !eol(उदाहरण के लिए *.java, *.html:।। पाठ के रूप में इलाज किया, लेकिन EOL शैली वरीयता सेट नहीं है तो ग्राहक सेटिंग प्रयोग किया जाता है)
-text -diff -merge(उदाहरण के लिए *.hugefile: पाठ के रूप में नहीं माना जाता है। कोई अंतर नहीं है / संभव नहीं है)
--- पूर्व अद्यतन
एक क्लाइंट का दर्दनाक उदाहरण जो गलत तरीके से फाइल करेगा:
netbeans 8.2 (विंडोज़ पर), गलत तरीके से CRLFs के साथ सभी टेक्स्ट फाइल करेगा, जब तक कि आपने स्पष्ट core.autocrlfरूप से वैश्विक के रूप में सेट नहीं किया है । यह मानक git क्लाइंट व्यवहार का विरोधाभास करता है, और बाद में अद्यतन / विलय करते समय बहुत सारी समस्याओं का कारण बनता है। यह वही है जो कुछ फ़ाइलों को अलग-अलग दिखाई देता है (हालांकि वे नहीं हैं) जब आप वापस करते हैं ।
Netbeans में भी यही व्यवहार होता है, भले ही आपने .gitattributesअपनी परियोजना में सही जोड़ा हो ।
कमिट के बाद निम्नलिखित कमांड का उपयोग करने से, कम से कम आपको यह पता लगाने में मदद मिलेगी कि क्या आपके गिट रेपो में लाइन समाप्त होने वाले मुद्दे हैं: git grep -I --files-with-matches --perl-regexp '\r' HEAD
मैं .gitattributesअंत में महसूस करने के लिए कि सबसे अच्छा संभव उपयोग के साथ आने के लिए घंटे बिताए हैं , कि मैं इस पर भरोसा नहीं कर सकता।
दुर्भाग्य से, जब तक JGit- आधारित संपादकों का अस्तित्व है (जो .gitattributesसही तरीके से नहीं संभाल सकते हैं ), सुरक्षित समाधान संपादक-स्तर पर भी LF को हर जगह बाध्य करने के लिए है।
निम्नलिखित anti-CRLFकीटाणुनाशकों का उपयोग करें ।
.gitattributes?