मैं विंडोज़ के तहत CR + LF के बजाय LF का उपयोग करने के लिए कैसे बाध्य करूं?


335

मैं विंडोज के तहत चेकआउट फ़ाइलों के लिए git को मजबूर करना चाहता हूं बस LFनहीं CR+LF। मैंने दो कॉन्फ़िगरेशन विकल्पों की जाँच की लेकिन मैं सेटिंग्स के सही संयोजन को खोजने में सक्षम नहीं था।

मैं चाहता हूं कि यह सभी फाइलों को फाइलों में बदले LFऔर रखे LF

टिप्पणी: मैंने इस्तेमाल किया autocrlf = inputलेकिन यह सिर्फ फाइलों की मरम्मत करता है जब आप उन्हें करते हैं। मैं उन्हें इस्तेमाल करने के लिए मजबूर करना चाहता हूं LF

संभवतः मैं इतना स्पष्ट नहीं था: रिपॉजिटरी पहले से ही उपयोग कर रहा है, LFलेकिन msysgit का उपयोग करके जांच की गई फाइलें उपयोग कर रही हैं CR+LFऔर मैं msysgit को उनके साथ पाने के लिए मजबूर करना चाहता हूं LF: यूनिक्स लाइन अंत के लिए मजबूर करना

>git config --list | grep crlf
core.autocrlf=input

2
autocrlf=inputसही विकल्प है। बेशक यह उन फाइलों से आपकी रक्षा नहीं करता है, जो वास्तव cr+lfमें भंडार में हैं या cr+lfउन्हें किसी अन्य उपकरण में फ़ाइलों को बनाने से पहले उन्हें जोड़ने के लिए। आपको क्या समस्या है कि यह काम नहीं करता है?
सीबी बेली

2
रिपॉजिटरी में फाइलें पहले से ही केवल उपयोग कर रही हैं, LFलेकिन जब मैं उन्हें विंडोज के तहत प्राप्त करता हूं तो msysgit उन्हें कनवर्ट करता है CR+LF
सोरिन

आपके कॉन्फ़िगरेशन के साथ कुछ होना चाहिए; मैंने अभी इसे अपने msysgit install पर टेस्ट किया है। autocrlfसेट के साथ input, git lfअकेले लाइनफीड छोड़ रहा है । आप के उत्पादन पोस्ट कर सकते हैं git config?
सीबी बेली

1
उस मामले में, मेरा सुझाव है कि आप एक बग लॉग इन करें; अधिमानतः एक परीक्षण रिपॉजिटरी की ओर इशारा करते हुए जो आपकी समस्या को प्रदर्शित करता है और इसमें आपके द्वारा देखे जा रहे व्यवहार के रूप में पुन: पेश करने के चरण शामिल हैं, निश्चित रूप से गलत है (लेकिन मैं इसे पुन: पेश नहीं कर सकता)।
सीबी बेली

1
एक छोटी सी टिप यह भी सुनिश्चित करना है कि आप 'git' पर git कमांड चला रहे हैं जो आपको लगता है कि आप हैं। उदाहरण के लिए, आपके पास विंडोज़ पर गिट स्थापित हो सकता है, और साइबरविन पर स्थापित किया जा सकता है, इसलिए सुनिश्चित करें कि आपने सही गिट कॉन्फ़िगरेशन सेट किया है।
lfred

जवाबों:


106

ओपी ने अपने सवाल में जोड़ा:

msysgit का उपयोग करके जाँच की गई फाइलें उपयोग कर रही हैं CR+LFऔर मैं msysgit को उनके साथ जाने के लिए मजबूर करना चाहता हूंLF

पहला सरल कदम अभी भी एक .gitattributesफ़ाइल में होगा:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(जैसा कि पोते द्वारा टिप्पणियों में उल्लेख किया गया है , .gitattributesएंड-ऑफ-लाइन रूपांतरण का उल्लेख करते हुए ), किसी से बचने के लिएCRLF सही के साथ फ़ाइलों के लिए रूपांतरण लिएeol

और मैंने हमेशा git config --global core.autocrlf false किसी भी रूपांतरण को अक्षम करने की सिफारिश की है (जो सभी पर लागू होगी संस्करणित फ़ाइलों पर )

क्रॉस प्लेटफॉर्म git config के लिए सर्वोत्तम अभ्यास देखें ?

Git 2.16 (Q1 2018) के बाद से, आप git add --renormalize .उन .gitattributesसेटिंग्स को तुरंत लागू करने के लिए उपयोग कर सकते हैं ।


लेकिन एक और अधिक शक्तिशाली कदम में एक गिट्ट्रिब्यूट फिल्टर ड्राइवर शामिल है और एक स्मज स्टेप जोड़ा गया है

फ़िल्टर ड्राइवर

जब भी आप अपने काम के पेड़ को अपडेट करेंगे, एक स्क्रिप्ट, केवल आपके द्वारा निर्दिष्ट फाइलों के लिए .gitattributes, LF eolऔर किसी भी अन्य स्वरूपण विकल्प को लागू करने के लिए बाध्य कर सकते हैं।
यदि " clear" स्क्रिप्ट कुछ भी नहीं करती है, तो आपके पास अपनी फ़ाइलों को बदलने के लिए (प्रतिबद्ध होने के बाद) आपके द्वारा अनुसरण किए जाने वाले प्रारूप की आवश्यकता होगी।


एक प्रश्न: * .txt .txt एक्सटेंशन वाली सभी फाइलों या सभी टेक्स्ट फाइलों (नॉन बाइनरी) को संदर्भित करता है? मैं परियोजना में सभी प्रकार के फ़ाइल एक्सटेंशन के साथ एक सूची नहीं बना सकता।
सोरिन

1
@ सोरीन: .txtएक्सटेंशन वाली सभी फाइलें । * को सामान्य करने से पहले, इसे स्थापित करना और इसे एक विशिष्ट समूह पर परीक्षण करना बेहतर है, और !*.xyz ...उस नियम से कुछ फ़ाइलों को बाहर करने के लिए एक नकारात्मक नियम जोड़ें ।
वॉनक

1
अब तक .gitattributesलाइनों को पढ़ना चाहिए: git-scm.com/docs/gitattributes के*.txt text eol=lf अनुसार
पोते

@grandchild धन्यवाद। अधिक दृश्यता के जवाब में मैंने आपकी टिप्पणी को शामिल किया है।
वॉन

मुझे लगता है कि हम जोड़ने के बाद हमें .gitattributesकरना होगाgit add --renormalize .
शुवा

461

विंडोज में LF एंडिंग प्राप्त करने का उचित तरीका core.autocrlfहै false:

git config --global core.autocrlf false

आपको यह करने की आवश्यकता है यदि आप msysgit का उपयोग कर रहे हैं, क्योंकि यह इसे trueइसकी सिस्टम सेटिंग्स में सेट करता है ।

अब git सामान्यीकरण को समाप्त करने वाली किसी भी लाइन को नहीं करेगा। यदि आप चाहते हैं कि आपके द्वारा जांच की जाने वाली फाइलें सामान्य हो जाएं, तो ऐसा करें: सभी फ़ाइलों के लिए text=autoअपने में सेट करें .gitattributes:

* text=auto

और इसके लिए सेट core.eolकरें lf:

git config --global core.eol lf

अब आप एकल रिपोस को चालू करके (कार्यशील निर्देशिका में!) में बदल सकते हैं

git config core.eol crlf

आपके द्वारा कॉन्फ़िगरेशन किए जाने के बाद, आप चाहते हैं कि रेपो में मौजूद सभी फाइलों को सामान्य किया जाए । ऐसा करने के लिए, अपने रेपो की जड़ पर जाएं और इन कमांडों को चलाएं:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

यदि आप अब अपनी वर्किंग डायरेक्टरी की फाइलों को भी सामान्य करना चाहते हैं , तो इन कमांड्स को चलाएं:

git ls-files -z | xargs -0 rm
git checkout .

3
मैं घातक पाथस्पेक्ट कर रहा हूं '' किसी भी फाइल से मेल नहीं खाता, ठीक उसके बादgit diff --cached --name-only -z | xargs -0 git add
CMCDragonkai

3
क्या के उत्पादन में है git diff --cached --name-only?
क्रोनिकल

1
यह ध्यान देने योग्य हो सकता है कि आप इस कॉन्फ़िगरेशन को प्रश्न में रेपो क्लोनिंग करते हुए सेट कर सकते हैं , उदा git clone --config core.autocrlf=false <repo path>
क्रिस लॉन्ग

240

मैं इस उत्तर पर काफी बार आता हूं, हालांकि इनमें से कोई भी मेरे लिए बिल्कुल सही नहीं है। उस ने कहा, मेरे लिए सही उत्तर दूसरों का मिश्रण है।

मुझे लगता है कि काम करता है निम्नलिखित है:

 git config --global core.eol lf
 git config --global core.autocrlf input

उन वैश्विक सेटिंग्स के सेट के बाद चेक किए गए रिपॉज के लिए, सब कुछ चेक किया जाएगा, क्योंकि यह रेपो में है - उम्मीद है LF( \n)। किसी भी चेकइन में CRLFबदल दिया जाएगा LF

एक मौजूदा रेपो के साथ जिसे आपने पहले ही चेक-आउट कर दिया है - जिसमें रेपो में सही लाइन एंडिंग है, लेकिन आपकी वर्किंग कॉपी नहीं - इसे ठीक करने के लिए आप निम्न कमांड्स चला सकते हैं:

git rm -rf --cached .
git reset --hard HEAD

यह ( तुरंत) के बिना rmपुनरावर्ती ( r) हटाए जाएंगे ( -f), उन सभी फ़ाइलों को छोड़कर जिन्हें आपने संपादित किया है ( --cached), वर्तमान निर्देशिका से ( .)। resetफिर एक राज्य है जहां वे अपने सच्चे लाइन अंत (मिलान क्या रेपो में है) के लिए उन फ़ाइलों के सभी देता है।

यदि आपको एक रेपो में फ़ाइलों की लाइन अंत को ठीक करने की आवश्यकता है, तो मैं एक संपादक को हथियाने की सलाह देता हूं जो आपको IntelliJ या उदात्त पाठ की तरह थोक में देगा, लेकिन मुझे यकीन है कि कोई भी अच्छा इस का समर्थन करेगा।


1
हमारे पास उप निर्देशिकाओं के साथ एक एकल रेपो है जिसे अलग-अलग लाइन को संभालने की आवश्यकता होती है। इसलिए एक वैश्विक विकल्प स्थापित करना इसके लिए कारगर नहीं है। सिंगल रेपो में भी नहीं। आप इन। सेटिंग्स को कैसे लागू करते हैं?
रॉबग

Notepad++नीचे दाएं कोने में कर्नेल्टी ओपन फाइल की लाइन एंडिंग भी दिखाता है। उस फ़ील्ड पर राइट क्लिक करने से आप लाइन एंडिंग को बदल सकते हैं।
विंकलेर्र

1
core.autocrlf inputविकल्प को ओवरराइड करता है core.eolसेटिंग है, तो स्थापित कर दोनों अनावश्यक है। (देखें git-scm.com/docs/git-config )
एंड्रयू मार्शल

1
धन्यवाद, आपकी मदद से मैंने लिंट और लिनक्स को जीत लिया है। और अब फाइलों में जांच कर सकते हैं।
18

57

प्रसंग

अगर तुम

  1. सभी उपयोगकर्ताओं को पाठ फ़ाइलों के लिए LF लाइन एंडिंग के लिए बाध्य करना चाहते हैं और
  2. आप यह सुनिश्चित नहीं कर सकते कि सभी उपयोगकर्ता अपने git config को बदल दें,

आप कर सकते हैं कि git 2.10 से शुरू। 2.10 या बाद के संस्करण की आवश्यकता है, क्योंकि 2.10 ने पाठ = ऑटो के व्यवहार को एक साथ eol = lf के साथ तय कियास्रोत

समाधान

.gitattributesनिम्नलिखित सामग्री रखने के लिए अपने गिट रिपॉजिटरी की जड़ में एक फ़ाइल रखो :

* text=auto eol=lf

इसे कमिट करें।

वैकल्पिक मोड़

आप यह .editorconfigसुनिश्चित करने के लिए अपने रिपॉजिटरी की जड़ में भी जोड़ सकते हैं कि आधुनिक टूलींग वांछित रेखा के अंत के साथ नई फाइलें बनाती है।

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

3
यह मेरे लिए सबसे अच्छा समाधान था। मैंने इसे editorconfig.org के साथ भी जोड़ा ताकि जब Intellij में मैं LF EOLs लिखूं।
२०

यह अब तक का सबसे अच्छा समाधान है। मैन्युअल रूप से कोई कॉन्फ़िगरेशन कमांड चलाने की आवश्यकता नहीं है!
कैमरन टैक्लिंड

26

core.autocrlf=inputजो आप चाहते हैं उसके लिए सही सेटिंग है, लेकिन आपको बदलाव करने के लिए git update-index --refreshऔर / या git reset --hardप्रभावी होने के लिए करना पड़ सकता है।

core.autocrlfसेट टू के साथ input, git चेक-आउट पर newline- रूपांतरण लागू नहीं करेगा (इसलिए यदि आपके पास रेपो में LF है, तो आपको LF मिलेगा), लेकिन यह सुनिश्चित करेगा कि यदि आप गड़बड़ करते हैं और काम में कुछ CRLF को लागू करते हैं किसी भी तरह कॉपी करें, वे रेपो में अपना रास्ता नहीं बनाएंगे।


19
कमांड git rm - cached -r होना चाहिए। && गिट रीसेट --हार्ड
koppor

0

आप इस समस्या का हल यहां देख सकते हैं: https://help.github.com/en/github/use-git/configuring-git-to-handle-line-endings

खिड़कियों पर आप इस समस्या को कैसे हल कर सकते हैं इसका सरल विवरण:

लाइन अंत के लिए वैश्विक सेटिंग्स git config core.autocrlf कमांड का उपयोग यह बदलने के लिए किया जाता है कि Git लाइन एंडिंग्स को कैसे संभालता है। यह एक ही तर्क लेता है।

विंडोज पर, आप बस कॉन्फ़िगरेशन के लिए सही पास करते हैं। उदाहरण के लिए: C:> git config --global core.autocrlf true

सौभाग्य, मुझे आशा है कि मैंने मदद की।

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