--- अद्यतन 3 --- (अद्यतन 2 के साथ संघर्ष नहीं करता है)
इस मामले को ध्यान में रखते हुए कि विंडोज़ उपयोगकर्ता काम करना पसंद करते हैं CRLF
और लिनक्स / मैक उपयोगकर्ता LF
पाठ फ़ाइलों पर काम करना पसंद करते हैं । रिपॉजिटरी मेंटेनर के दृष्टिकोण से उत्तर प्रदान करना :
मेरे लिए सबसे अच्छी रणनीति (हल करने के लिए कम समस्याएं) है: सभी पाठ फ़ाइलों को LF
git repo के अंदर रखें, भले ही आप केवल विंडोज प्रोजेक्ट पर काम कर रहे हों। फिर ग्राहकों को उनकी पसंद की लाइन-एंडिंग शैली पर काम करने की स्वतंत्रता दें , बशर्ते कि वे एक core.autocrlf
संपत्ति मूल्य चुनें जो आपकी रणनीति का सम्मान करेंगे (रेपो पर एलएफ) जबकि प्रतिबद्ध के लिए फाइल का मंचन करते हैं।
स्टेजिंग वह है जिसे समझने की कोशिश करते समय कितने लोग भ्रमित होते हैं कि न्यूलाइन रणनीतियां कैसे काम करती हैं। core.autocrlf
संपत्ति के लिए सही मूल्य चुनने से पहले निम्नलिखित बिंदुओं को कम करना आवश्यक है :
- कमिट के लिए एक टेक्स्ट फ़ाइल जोड़ना ( इसे स्टेज करना) कनवर्ट की गई लाइन-एंडिंग ( आपके क्लाइंट कॉन्फिगर पर मूल्य के आधार पर ) के साथ सब-डायरेक्टरी के अंदर फाइल को दूसरी जगह कॉपी करने जैसा है । यह सब स्थानीय स्तर पर किया जाता है।
.git/
core.autocrlf
- सेटिंग प्रश्न का उत्तर
core.autocrlf
प्रदान करने जैसा है (सभी OS पर सटीक प्रश्न):
- "चाहिए Git-ग्राहक एक। कन्वर्ट वामो करने वाली CRLF जब जाँच-आउट (खींच) रिमोट से रेपो परिवर्तन या ख। धर्मांतरित CRLF करने वाली वामो जब एक फ़ाइल जोड़ने के लिए प्रतिबद्ध के लिए? " और संभव जवाब (मान) इस प्रकार हैं:
false:
" ऐसा कोई भी ऊपर के ",
input:
" करते हैं केवल ख "
true
: " ऐसा एक और और ख "
- ध्यान दें कि कोई " नहीं है "
भाग्यवश
- git क्लाइंट डिफॉल्ट्स (विंडोज़:,
core.autocrlf: true
linux / 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
?