Git के साथ रणनीति को संभालने के लिए सबसे अच्छा CRLF (गाड़ी वापसी, लाइन फीड) क्या है?


598

मैंने सीआरएलएफ-एंडिंग लाइनों के साथ फाइल करने की कोशिश की, लेकिन यह विफल रहा।

मैंने अपने विंडोज कंप्यूटर पर अलग-अलग रणनीतियों की कोशिश करते हुए एक पूरा दिन बिताया और जीआईटी का उपयोग करने की कोशिश को रोकने के लिए लगभग तैयार किया गया था और इसके बजाय मर्क्यूरियल की कोशिश की ।

कृपया प्रति उत्तर केवल एक सर्वोत्तम अभ्यास साझा करें।

जवाबों:


753

इस सवाल को पूछने के लगभग चार साल बाद, मुझे आखिरकार ऐसा जवाब मिल गया है जो मुझे पूरी तरह से संतुष्ट करता है !

गितुब में विवरण देखें : लाइन एंडिंग से निपटने के लिए गाइड की मदद करें

Git आपको फ़ाइल में पाठ विशेषता का उपयोग करके सीधे रेपो के लिए लाइन समाप्त करने वाली संपत्तियों को सेट करने की अनुमति देता है .gitattributes। यह फ़ाइल रेपो में प्रतिबद्ध है और core.autocrlfसेटिंग को ओवरराइड करती है, जिससे आप सभी उपयोगकर्ताओं के लिए उनके git सेटिंग्स की परवाह किए बिना लगातार व्यवहार सुनिश्चित कर सकते हैं।

और इस तरह

इसका लाभ यह है कि आपके लाइन कॉन्फ़िगरेशन का अंत अब आपके रिपॉजिटरी के साथ यात्रा करता है और आपको इस बात की चिंता करने की आवश्यकता नहीं है कि सहयोगियों के पास उचित वैश्विक सेटिंग्स हैं या नहीं।

यहाँ एक .gitattributesफ़ाइल का एक उदाहरण है

# Auto detect text files and perform LF normalization
*        text=auto

*.cs     text diff=csharp
*.java   text diff=java
*.html   text diff=html
*.css    text
*.js     text
*.sql    text

*.csproj text merge=union
*.sln    text merge=union eol=crlf

*.docx   diff=astextplain
*.DOCX   diff=astextplain

# absolute paths are ok, as are globs
/**/postinst* text eol=lf

# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf

सबसे लोकप्रिय प्रोग्रामिंग भाषाओं के लिए .gitattributes फ़ाइलों का उपयोग करने के लिए तैयार का एक सुविधाजनक संग्रह है । यह आपको शुरू करने के लिए उपयोगी है।

एक बार जब आप अपना निर्माण या समायोजन कर लेते हैं .gitattributes, तो आपको एक बार और सभी लाइन के अंत को फिर से सामान्य करने का काम करना चाहिए

ध्यान दें कि आपके प्रोजेक्ट में Git repo खोलने के बाद GitHub डेस्कटॉप ऐप सुझाव दे सकता है और एक .gitattributesफ़ाइल बना सकता है । यह प्रयास करने के लिए, गियर आइकन (ऊपरी दाएं कोने में)> रिपॉजिटरी सेटिंग्स ...> लाइन एंडिंग और विशेषताओं पर क्लिक करें। आपको अनुशंसित जोड़ने के लिए कहा जाएगा .gitattributesऔर यदि आप सहमत हैं, तो ऐप आपके भंडार में सभी फाइलों का एक सामान्यीकरण भी करेगा।

अंत में, माइंड द एंड ऑफ योर लाइन लेख अधिक पृष्ठभूमि प्रदान करता है और बताता है कि कैसे जीआईटी हाथ में मामलों पर विकसित हुआ है। मैं इस आवश्यक पढ़ने पर विचार करता हूं ।

आपको संभवतः आपकी टीम में ऐसे उपयोगकर्ता मिले हैं जो अपने परिवर्तन करने के लिए EGit या JGit (Eclipse और TeamCity जैसे उपकरण इनका उपयोग करते हैं) का उपयोग करते हैं। फिर आप भाग्य से बाहर हैं, जैसा कि @gatinueta ने इस उत्तर की टिप्पणियों में समझाया:

यह सेटिंग आपको पूरी तरह से संतुष्ट नहीं करेगी यदि आपके पास आपकी टीम में ईजित या जीजीटी के साथ काम करने वाले लोग हैं, क्योंकि वे उपकरण सिर्फ उपेक्षा करेंगे। CRLF फ़ाइलों में .gitattributes और खुशी से चेक करें https://bugs.eclipse.org/bugs/shug_bug.cgi? आईडी = 342,372

SourceTree का कहना है कि एक ट्रिक उन्हें दूसरे क्लाइंट में अपने बदलाव करने के लिए हो सकती है । हमारी टीम ने उस उपकरण को कई उपयोग के मामलों के लिए एक्लिप्स इजीट को प्राथमिकता दी।

किसने कहा कि सॉफ्टवेयर आसान है? : - /


7
विंडोज साझा करने के लिए देखभाल .gitattributes?
कर्नल पैनिक

आप कैसे देख सकते हैं कि .gitattributesविंडोज के लिए GitHub आपके प्रोजेक्ट के लिए क्या सुझाव देता है? मैंने विंडोज के लिए गिटहब स्थापित किया, जीयूआई संस्करण शुरू किया और .gitattributesसुझावों से संबंधित किसी भी विकल्प को खोजने में असमर्थ था ।
JLDiaz

4
यह सेटिंग के बाद से egit सिर्फ .gitattributes ध्यान न दें और खुशी से CRLF में जाँच करेगा, पूरी तरह से आप संतुष्ट नहीं करेगा आप अपनी टीम में Egit साथ काम कर रहे लोगों के लिए है, तो फ़ाइलें bugs.eclipse.org/bugs/show_bug.cgi?id=342372
gatinueta

19
विंडोज के लिए मैं आमतौर पर वैश्विक सेट करने के लिए इच्छुक core.autocrlf = falseहूं - मैं हर जगह एलएफ को पसंद करता हूं, लेकिन विंडोज के कुछ उपकरण जैसे विजुअल स्टूडियो कुछ फ़ाइलों में सीआरएलएफ एंडिंग पर जोर देते हैं (और कुछ में भी मिश्रण करते हैं); मुंगिंग लाइन एंडिंग सबसे सुरक्षित विकल्प नहीं है। यदि आप जानते हैं कि आप क्या कर रहे हैं, तो मैं शायद core.autocrlf = inputविंडोज पर परियोजनाओं के लिए उपयोग और अपवाद बनाऊंगा जो आप जानते हैं कि लाइन एंडिंग के प्रति संवेदनशील हैं। जैसा कि अन्य लोग बताते हैं, हर सभ्य टेक्स्ट एडिटर एलएफ एंडिंग का समर्थन करता है। मुझे वास्तव में लगता है कि core.autocrlf = trueशायद इससे अधिक परेशानी हो सकती है क्योंकि यह रोकता है।
एड्रियन

1
@gatinueta अधिक विशिष्ट होने के लिए, यह एक JGit मुद्दा है। मतलब TeamCity, जो JGit का भी उपयोग करती है, सीधे इग्नोर करती है।
sdds

122

लाइन अंत मत बदलो। यह डेटा की व्याख्या करने के लिए वीसीएस का काम नहीं है - बस स्टोर करें और इसे संस्करण दें। हर आधुनिक टेक्स्ट एडिटर दोनों तरह के लाइन एंडिंग को पढ़ सकता है।


25
Seconded। यदि आपके पास असंगत लाइन-एंडिंग के साथ समस्याएं हैं, तो सबसे अच्छा समाधान यह है कि जब तक वे इसे ठीक न करें, गलत संपादक सेटिंग्स का उपयोग कर रहे हैं।

136
सहमत नहीं हैं। सभी प्लेटफार्मों पर देशी लाइनफीड एक सुविधा है।
जोनास बिस्ट्रोम

25
विजुअल स्टूडियो एक पीटीए है जब यह CRLF के अलावा किसी अन्य चीज की बात आती है।
ब्रेट रायन

32
Git में लाइन-एंडिंग्स को परिवर्तित न करने का एक विकल्प है, यह है आटोक्रॉफ़्ट = गलत और जब तक आप क्रॉस-प्लेटफ़ॉर्म विकास नहीं कर रहे हैं, जैसे मानो यह विंडोज़ के नीचे चलने पर झूठे के लिए सबसे अच्छा छोड़ दिया जाता है और यदि आप ओपन-सोर्स विकसित कर रहे हैं तो सही पर सेट करें मोनो के लिए।
क्रिस निकोला

24
लाइन एंडिंग की समस्या सही कंप्यूटिंग है। तो इसका उत्तर गलत और भ्रामक है।
cos

84

आप लगभग हमेशा चाहते हैं autocrlf=inputजब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं।

नीचे कुछ अतिरिक्त संदर्भ:

यह या तो core.autocrlf=trueतब होना चाहिए जब आप डॉस समाप्त core.autocrlf=inputकरना पसंद करते हैं या यदि आप यूनिक्स-नईलाइन्स पसंद करते हैं। दोनों ही मामलों में, आपके गिट रिपॉजिटरी में केवल LF होगा, जो राइट थिंग है। इसके लिए एकमात्र तर्क यह core.autocrlf=falseथा कि स्वचालित रूप से गलत तरीके से पाठ के रूप में कुछ बाइनरी का पता लगाया जा सकता है और फिर आपकी टाइल भ्रष्ट हो जाएगी। इसलिए, core.safecrlfएक अपरिवर्तनीय परिवर्तन होने पर उपयोगकर्ता को चेतावनी देने के लिए विकल्प पेश किया गया था। वास्तव में, अपरिवर्तनीय परिवर्तनों की दो संभावनाएं हैं - पाठ फ़ाइल में मिश्रित लाइन-एंडिंग, इस सामान्यीकरण में वांछनीय है, इसलिए इस चेतावनी को नजरअंदाज किया जा सकता है, या (बहुत ही संभावना नहीं है) कि गलत तरीके से पाठ के रूप में आपकी बाइनरी फ़ाइल का पता लगाया। फिर आपको गिट को बताने के लिए विशेषताओं का उपयोग करने की आवश्यकता है कि यह फ़ाइल द्विआधारी है।

उपरोक्त पैराग्राफ मूल रूप से gmane.org पर एक धागे से खींचा गया था, लेकिन यह तब से नीचे चला गया है।


31
यह "राइट थिंग" क्यों है?
आर्टेम टिखोमीरोव 9

35
core.autocrlf = true एक भयानक विचार है। मुझे उस विकल्प से कोई परेशानी नहीं है, साथ ही जब भी आप रिपॉजिटरी को क्लोन करते हैं तो आपको इसे सेट करना याद रखना होगा।
लुइसे ओलिवेरा

28
जब तक आप नहीं जानते कि आप क्या कर रहे हैं, तब तक autocrlf = true का उपयोग न करें। यदि आप DOS / Win में विकसित होते हैं तो autocrlf = false अंत को दूरस्थ और स्थानीय रेपो के बीच एक समान रखेगा और लगभग हर स्थिति में सबसे अच्छा विकल्प है।
क्रिस निकोला

13
@ क्रिस - यदि आपके डेवलपर्स के पास विंडोज़ और मल्टी-प्लेटफ़ॉर्म प्रोजेक्ट्स हैं, जहां मल्टी-प्लेटफ़ॉर्म डेवलपर्स में से कुछ ओएसएक्स या लिनक्स पर काम करते हैं? सबसे अच्छा विकल्प नहीं होना चाहिए फिर आटोक्रॉफ्ट = सच होना चाहिए?
ब्रेट रेयान

20
आरक्षण के साथ अपवित्र। परिचयात्मक पैराग्राफ अप्रभावी है। core.autocrlf=inputविहित उत्तर है। अधिकांश उपयोग के मामलों के लिए, core.autocrlf=trueऔर core.autocrlf=falseअत्यधिक उत्साही हैं (... विपरीत लेकिन समान रूप से भयानक तरीके से, निश्चित रूप से) और इसलिए आंतरिक रूप से विनाशकारी हैं। "विंडोज के लिए गिट" को वास्तव में "चेकआउट के साथ-साथ, यूनिक्स-स्टाइल लाइन एंडिंग्स के लिए प्रतिबद्ध होना चाहिए " (यानी, core.autocrlf=input) अपनी डिफ़ॉल्ट न्यूलाइन रणनीति के रूप में होना चाहिए। यह नहीं था तो यहाँ हम यहाँ हैं - 2015 में फ्रिकिन - अभी भी अंतहीन इस पर बहस कर रहे हैं।
सेसिल करी

58

दो वैकल्पिक रणनीतियों के अनुरूप मिल मिश्रित वातावरण (माइक्रोसॉफ्ट + लिनक्स + मैक) में लाइन अंत के बारे में:

ए। ग्लोबल प्रति ऑल रिपॉजिटरी सेटअप

1) सभी को एक प्रारूप में बदलें

find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'

2) सेट core.autocrlfकरने के लिए inputलिनक्स / यूनिक्स पर या trueएमएस विंडोज पर (भंडार या वैश्विक)

git config --global core.autocrlf input

3) [वैकल्पिक] सेट core.safecrlfकरने के लिए true(बंद करने के लिए) या warn(गाने के लिए :) अतिरिक्त गार्ड को जोड़ने के लिए अगर उलटा हुआ नयालाइन परिवर्तन एक ही फ़ाइल में परिणाम होगा

git config --global core.safecrlf true


बी या प्रति रिपॉजिटरी सेटअप

1) सभी को एक प्रारूप में बदलें

find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'

2) .gitattributesअपनी रिपॉजिटरी में फ़ाइल जोड़ें

echo "* text=auto" > .gitattributes
git add .gitattributes
git commit -m 'adding .gitattributes for unified line-ending'

अपनी द्विआधारी फ़ाइलों के बारे में चिंता न करें - उनके बारे में समझदार होना चाहिए।


Safeecrlf / autocrlf चरों के बारे में अधिक


5
वैश्विक दृष्टिकोण == सेट और सभी रेपो बनाम प्रति रेपो == के लिए भूल जाते हैं और दूसरों को अपने वैश्विक कॉन्फ़िगरेशन को बदलने की आवश्यकता नहीं होती है।
लुकमडो

4
dos2unixएक कमांड-लाइन-टूल है जो सिस्टम के आधार पर आपको अतिरिक्त रूप से स्थापित करना पड़ सकता है
lukmdo

2
वे अनन्य नहीं हैं, आप एक ही समय में दोनों तरीकों का उपयोग कर सकते हैं। इसके अलावा, उपयोग करते समय बहुत सावधान रहें dos2unix- भ्रष्ट.git/index होने का खतरा है और हमें इसे हर फ़ाइल पर लागू करने की आवश्यकता नहीं है। यह बेहतर है जैसे कुछ का उपयोग करके find ./ -name "*.html"और निर्दिष्ट करें कि आप इसे किस फाइल पर लागू करना चाहते हैं।
cregox

6
चेतावनी: चलाने से पहले findलाइनों, ध्यान रखें: dos2unixकि विंडोज के लिए Git साथ shiped आता है एक अजीब (IMO मूर्खतापूर्ण और खतरनाक) व्यवहार, कोई तर्क के साथ है: यूनिक्स से बदल रहा है, के बजाय यह टॉगल न्यू लाइन प्रारूप (डॉस <-> यूनिक्स )
leonbloy

2
और एक और चेतावनी: अपने .git फ़ोल्डर को DOS2UNIX न करें। बस केह रहा हू।
हकर्रे

10

करने के लिए core.autocrlfकॉन्फ़िगरेशन विकल्प सेट करने का प्रयास करें truecore.safecrlfविकल्प पर भी एक नजर ।

वास्तव में ऐसा लगता है core.safecrlfकि पहले से ही आपके भंडार में सेट किया जा सकता है, क्योंकि (जोर मेरा):

यदि यह core.autocrlf की वर्तमान सेटिंग के मामले में नहीं है, तो git फ़ाइल को अस्वीकार कर देगा

यदि यह मामला है, तो आप यह जांचना चाह सकते हैं कि आपका टेक्स्ट एडिटर लगातार लाइन एंडिंग का उपयोग करने के लिए कॉन्फ़िगर किया गया है। यदि किसी पाठ फ़ाइल में LF और CRLF लाइन अंत का मिश्रण है, तो आप समस्याओं में भाग लेंगे।

अंत में, मुझे लगता है कि "आपको जो दिया जाता है" का उपयोग करने की अनुशंसा और विंडोज पर एलएफ समाप्त लाइनों का उपयोग करने से सोल्व की तुलना में अधिक समस्याएं पैदा होंगी। Git के पास उपरोक्त विकल्प हैं कि वे लाइन अंत को एक समझदार तरीके से संभालने की कोशिश करें, इसलिए यह उनका उपयोग करने के लिए समझ में आता है।


1
क्या .gitattributes फ़ाइल के माध्यम से रिपॉजिटरी विस्तृत सेटिंग्स का उपयोग करना बेहतर नहीं होगा? बस सोच रहा था: प्रत्येक उपयोगकर्ता को अपनी मशीन पर अपनी पंक्ति की समाप्ति सेटिंग्स का ध्यान रखने के लिए मजबूर करना असुविधाजनक है ... या अन्य कमियां हैं?
ट्रेनोआसिस

10

का उपयोग कर core.autocrlf=falseसे चिह्नित किया जा रहा के रूप में मैं उन्हें अपने में चेक आउट के रूप में जल्द ही अपडेट सभी फाइलों को बंद कर दिया दृश्य स्टूडियो 2010 परियोजना। विकास टीम के अन्य दो सदस्य भी विंडोज सिस्टम का उपयोग कर रहे हैं, इसलिए मिश्रित वातावरण खेलने में नहीं आया, फिर भी रिपॉजिटरी के साथ आने वाली डिफ़ॉल्ट सेटिंग्स हमेशा क्लोनिंग के तुरंत बाद सभी फाइलों को अपडेट के रूप में चिह्नित करती हैं।

मुझे लगता है कि आपके पर्यावरण के लिए CRLF सेटिंग क्या काम करती है, यह जानने के लिए नीचे की रेखा है। विशेष रूप से चूंकि हमारे लिनक्स बॉक्स पर कई अन्य रिपॉजिटरी में सेटिंग autocrlf = trueबेहतर परिणाम देती है।

20+ साल बाद और हम अभी भी OSes के बीच असमानताओं को समाप्त करने वाली लाइन के साथ काम कर रहे हैं ... दुख की बात है।


31
@ नारंगी 80, असमानता दुर्भाग्यपूर्ण है, लेकिन इसे विंडोज की गलती कहने का कोई कारण नहीं है। एलएफ-केवल एक न्यूनतम दृष्टिकोण से समझ में आता है, शायद; लेकिन CRLF CR और LF के अर्थ के आधार पर अधिक समझ में आता है। "कैरिज रिटर्न" का अर्थ है लाइन की शुरुआत में वापस आना; "लाइन फीड" का अर्थ है अगली पंक्ति की शुरुआत की बजाय सीधे अगली पंक्ति में जाना। सिमेंटिक दृष्टिकोण से, विंडोज दोनों होने में अधिक सही है: शुरुआत में वापस जाएं (सीआर) और फिर नीचे एक पंक्ति (एलएफ)।
रेयान लुंडी

40
@Kyralessa "अधिक सही" अभी भी नाटक कर रहा है कि एक कंप्यूटर एक टाइपराइटर है, जो यह नहीं है, btw। टाइपराइटर सादृश्य को बनाए रखने का कोई मतलब नहीं है, यह देखते हुए कि यह कुछ ऐसा नहीं है जो अंत-उपयोगकर्ता कभी भी निपटेंगे, और यह कि एक के बजाय दो वर्ण व्यर्थ हैं।
jpswain 20

1
कुछ वर्षों तक इस पार्टी में देर से, लेकिन आपने इस तथ्य को नजरअंदाज कर दिया कि सीआर और एलएफ कर्सर पोजिशनिंग टूल हैं। "सीआर" इतिहास में इस बिंदु पर "कर्सर वापसी" हो सकता है। अगर मैं चाहता था कि कर्सर लाइन की शुरुआत में वापस आ जाए, तो मैं एप्लिकेशन को ऐसा करने के लिए कहूंगा। अन्यथा, मुझे इसे वहीं रखना होगा जहां मैंने इसे रखा था।
EKW

2
इसके अलावा, अगर CRLF "अधिक सही" है क्योंकि एक टेक्स्टफाइल न्यूलाइन वास्तव में एक "एक पंक्ति नीचे ले जाना" और "लाइन की शुरुआत करने के लिए आगे बढ़ना" दोनों है, तो यह अनुसरण करेगा कि सिर्फ एक सीआर पाठ संपादक के साथ एक पंक्ति को अधिलेखित करने का कारण बनेगा निम्नलिखित पंक्ति। मैं ऐसे संपादकों के बारे में नहीं जानता जो वास्तव में इसका समर्थन करते हैं, जिसका अर्थ है कि CRLF और CR दोनों को अलग-अलग चीजों के रूप में व्यक्त करने की आवश्यकता वास्तव में मौजूद नहीं है।
avl_sweden

@avl_sweden DOS से पहले यह बहुत ही सामान्य व्यवहार था, और जब से Microsoft को लगता है कि संगतता महत्वपूर्ण है, तब से यह उस तरह से बना हुआ है। यह अमेरिका में भी मानक तरीका था (जैसा कि एएसए के रूप में) - आईएसओ ने सीआर + एलएफ और एलएफ दोनों की अनुमति दी (इसलिए फिर से, डॉस मानकों के अनुरूप था); साठ के दशक से दोनों मामलों में। मल्टिक्स (यूनिक्स अग्रदूत) ने बोल्ड / स्ट्राइक के लिए सीआर का समर्थन किया। आजकल कई अनुप्रयोग (जिनमें .NET की "लाइनों द्वारा विभाजित" सुविधाएँ शामिल हैं) तीन (अकेला सीआर, अकेला एलएफ, सीआरएलएफ) में से किसी एक को ढूंढते हैं, और उनमें से प्रत्येक को एंड-लाइन मानते हैं। कई एप्लिकेशन अभी भी एक फ़ाइल में मिश्रित लाइन-एंडिंग द्वारा भ्रमित हैं, हालांकि।
लुआं

7

ये विंडोज और विजुअल स्टूडियो उपयोगकर्ताओं के लिए दो विकल्प हैं जो मैक या लिनक्स उपयोगकर्ताओं के साथ कोड साझा करते हैं । एक विस्तारित विवरण के लिए, गिट्टुएंजेस मैनुअल पढ़ें ।

* पाठ = ऑटो

आपके रेपो की .gitattributesफ़ाइल में:

*   text=auto

यह LFरेपो में लाइन एंडिंग वाली सभी फाइलों को सामान्य कर देगा ।

और आपके ऑपरेटिंग सिस्टम ( core.eolसेटिंग) के आधार पर , LFयूनिक्स आधारित सिस्टम के लिए या CRLFविंडोज सिस्टम के लिए काम करने वाले पेड़ की फाइलों को सामान्य किया जाएगा ।

यह कॉन्फ़िगरेशन है जो Microsoft .NET repos उपयोग करता है।

उदाहरण:

Hello\r\nWorld

रेपो में हमेशा की तरह सामान्यीकृत किया जाएगा:

Hello\nWorld

चेकआउट करने पर, विंडोज में काम करने वाले पेड़ को निम्न में बदल दिया जाएगा:

Hello\r\nWorld

चेकआउट पर, मैक में काम कर रहे पेड़ को इस प्रकार छोड़ा जाएगा:

Hello\nWorld

नोट: यदि आपके रेपो में पहले से ही फ़ाइलें सामान्यीकृत नहीं हैं, git statusतो इन फ़ाइलों को पूरी तरह से संशोधित करने के बाद अगली बार जब आप उन पर कोई बदलाव करेंगे, और यह अन्य उपयोगकर्ताओं के लिए उनके परिवर्तनों को बाद में मर्ज करने के लिए एक दर्द हो सकता है। अधिक जानकारी के लिए लाइन अंत बदलने के बाद एक भंडार को ताज़ा करते हुए देखें ।

core.autocrlf = true

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

विंडोज उपयोगकर्ताओं के लिए, git config --global core.autocrlf trueएक बढ़िया विकल्प है क्योंकि:

  • रेपो में जोड़े जाने पर ही फाइल को LFलाइन एंडिंग के लिए सामान्य किया जाता है । यदि रेपो में सामान्यीकृत फ़ाइलें नहीं हैं, तो यह सेटिंग उन्हें स्पर्श नहीं करेगी।
  • सभी टेक्स्ट फाइलें CRLFकार्यशील निर्देशिका में लाइन एंडिंग में बदल जाती हैं ।

इस दृष्टिकोण के साथ समस्या यह है कि:

  • यदि आप एक विंडोज यूजर हैं autocrlf = input, तो आपको LFलाइन एंडिंग वाली फाइलों का एक गुच्छा दिखाई देगा । टीम के बाकी सदस्यों के लिए कोई खतरा नहीं है, क्योंकि आपके कमिट्स को अभी भी LFलाइन एंडिंग के साथ सामान्य किया जाएगा ।
  • यदि आप एक Windows उपयोगकर्ता हैं core.autocrlf = false, तो आपको LFलाइन एंडिंग वाली फ़ाइलों का एक गुच्छा दिखाई देगा और आप CRLFरेपो में लाइन एंडिंग वाली फ़ाइलों को प्रस्तुत कर सकते हैं ।
  • अधिकांश मैक उपयोगकर्ता उपयोग करते हैं autocrlf = inputऔर CRLFफाइल एंडिंग के साथ फाइल प्राप्त कर सकते हैं , शायद विंडोज उपयोगकर्ताओं से core.autocrlf = false

1
विंडोज़ उपयोगकर्ताओं के लिए आपका आदेश कहता है git config --global core.autocrl true। आपका मतलब है git config --global core.autocrlf true
जूलिकलकैट

6

--- अद्यतन 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लाइन से सावधान रहें , यह Git <2.10 में अनपेक्षित परिणाम है, देखें stackoverflow.com/a/29508751/2261442
phk

डराना ... मेरे पास मेरे जवाब देने के टन हैं git config --global core.autocrlf false, और .gitattributesकेवल निर्देशों में ईओएल से निपटने की सिफारिश की है ।
VonC

5

यह सिर्फ एक समाधान समाधान है:

सामान्य मामलों में, उन समाधानों का उपयोग करें जिन्हें गिट के साथ भेज दिया गया है। ये ज्यादातर मामलों में महान काम करते हैं। सेना वामो के लिए आप की स्थापना करके Windows और यूनिक्स आधारित सिस्टम पर विकास का हिस्सा है, तो .gitattributes

मेरे मामले में> विंडोज में एक प्रोजेक्ट विकसित करने वाले 10 प्रोग्रामर थे। इस परियोजना को CRLF के साथ जांचा गया था और LF को बाध्य करने का कोई विकल्प नहीं था।

कुछ सेटिंग्स आंतरिक रूप से एलएफ प्रारूप पर किसी भी प्रभाव के बिना मेरी मशीन पर लिखी गई थीं; इस प्रकार कुछ फाइलें विश्व स्तर पर बदल कर प्रत्येक छोटी फ़ाइल परिवर्तन पर LF में बदल गईं।

मेरा समाधान:

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

यूनिक्स की मशीनें

  1. किसी कॉन्फ़िगरेशन [alias]अनुभाग में निम्न पंक्तियाँ जोड़ें । यह कमांड सभी परिवर्तित (यानी संशोधित / नई) फाइलों को सूचीबद्ध करती है:

    lc = "!f() { git status --porcelain \
                 | egrep -r \"^(\?| ).\*\\(.[a-zA-Z])*\" \
                 | cut -c 4- ; }; f "
  2. उन सभी परिवर्तित फ़ाइलों को डॉस प्रारूप में परिवर्तित करें:

    unix2dos $(git lc)
  3. वैकल्पिक रूप से ...

    1. इस प्रक्रिया को स्वचालित करने के लिए इस क्रिया के लिए एक गिट हुक बनाएँ

    2. परम का उपयोग करें और इसे शामिल करें और grepकेवल विशेष फ़ाइलनाम से मिलान करने के लिए फ़ंक्शन को संशोधित करें , जैसे:

      ... | egrep -r "^(\?| ).*\.(txt|conf)" | ...
    3. एक अतिरिक्त शॉर्टकट का उपयोग करके इसे और भी सुविधाजनक बनाने के लिए स्वतंत्र महसूस करें:

      c2dos = "!f() { unix2dos $(git lc) ; }; f "

      ... और रूपांतरित सामग्री को आग लगाकर

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