Windows git "चेतावनी: LF को CRLF द्वारा प्रतिस्थापित किया जाएगा", क्या यह चेतावनी पूंछ पीछे की ओर है?


147

env:

  • विंडोज 7
  • msysgit

Wheng I git commit, यह कहता है:

warning: LF will be replaced by CRLF. 

क्या यह चेतावनी पूंछ पिछड़ी है?
मैं विंडोज में फाइल एडिट करता हूं, लाइन का अंत CRLFइस तस्वीर की तरह है:
यहां छवि विवरण दर्ज करें
और git इसे LFरेपो के लिए कमिट करने के लिए बदलता है ।
इसलिए मुझे लगता है कि सही चेतावनी है:

warning: CRLF will be replaced by LF. 


2
@ देवनबुल का मतलब है कि चेतावनी पूंछ पिछड़ी है, है ना?
हांगे.हु।

@ Honghe.Wu नहीं, यह विंडोज पर नहीं है। मैंने नीचे अपना जवाब
वॉनसी

11
महान सवाल क्योंकि वास्तव में, चेतावनी पिछड़ी हुई लगती है। यह वास्तव में परिवर्तित करने के बारे में यह चेतावनी प्राप्त करने के लिए भ्रामक है CRLF के लिए एक पर प्रतिबद्ध क्योंकि चेतावनी है, और रिक्त स्थान को की Git से निपटने में मदद मिलेगी समझा का कोई राशि पीछे की ओर
Stijn de Witt

1
@StijndeWitt मैं आपको इसे उभारने के उत्तर के रूप में टिप्पणी करते हुए देखना पसंद करूंगा।
user1460043

जवाबों:


185

चेतावनी: LF को CRLF द्वारा प्रतिस्थापित किया जाएगा।

आपके द्वारा उपयोग किए जा रहे संपादक के आधार पर, LF के साथ एक पाठ फ़ाइल आवश्यक नहीं है CRLF के साथ सहेजा जाएगा: हाल के संपादक ईओल शैली को संरक्षित कर सकते हैं। लेकिन यह git config सेटिंग को बदलने पर जोर देता है ...

बस यह सुनिश्चित करें कि (जैसा मैं यहाँ सुझाता हूँ ):

git config --global core.autocrlf false

इस तरह, आप किसी भी स्वचालित परिवर्तन से बचते हैं, और फिर भी उन्हें .gitattributesफ़ाइल और core.eolनिर्देशों के माध्यम से निर्दिष्ट कर सकते हैं ।


विंडोज़ git "LF को CRLF द्वारा प्रतिस्थापित किया जाएगा"
क्या यह चेतावनी पूंछ पीछे है?

नहीं: आप Windows पर हैं, और git configमदद पृष्ठ उल्लेख करता है

यदि आप CRLFअपनी वर्किंग डायरेक्टरी में लाइन एंडिंग करना चाहते हैं तो भी इस सेटिंग का उपयोग करें , हालांकि रिपॉजिटरी में सामान्यीकृत लाइन एंडिंग्स नहीं हैं।

जैसा कि " CRLF के साथ LF की जगह git " में वर्णित है , यह केवल चेकआउट (कमिट नहीं) के साथ होना चाहिएcore.autocrlf=true

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

जैसा कि XiaoPeng के उत्तर में उल्लेख किया गया है , यह चेतावनी निम्नानुसार है:

चेतावनी: (यदि आप इसकी जांच करते हैं / या अपने वर्तमान core.autocrlfकॉन्फ़िगरेशन के साथ किसी अन्य फ़ोल्डर में क्लोन करते हैं ), LF को CRLF द्वारा प्रतिस्थापित किया
जाएगा। फ़ाइल में आपकी (वर्तमान) कार्यशील निर्देशिका में इसकी मूल पंक्ति समाप्त होगी।

जैसा कि बताया गया है git-for-windows/git 1242 अंक :

मुझे अभी भी लगता है कि यह संदेश भ्रामक है, इस मुद्दे के बेहतर स्पष्टीकरण को शामिल करने के लिए संदेश को बढ़ाया जा सकता है, उदाहरण के लिए: "LF को file.jsonफ़ाइल को हटाने और इसे फिर से जाँचने के बाद CRLF द्वारा प्रतिस्थापित किया जाएगा "।

नोट: Git 2.19 (Sept 2018), का उपयोग करते समय core.autocrlf, फर्जी "LF को CRLF द्वारा प्रतिस्थापित किया जाएगा" चेतावनी अब दबा दी गई है


के रूप में सही टिप्पणी quaylar , यदि कोई रूपांतरण है, तो यह LFकेवल करना है।

वह विशिष्ट चेतावनी " LF will be replaced by CRLF" Convert.c # check_safe_crlf () से आती है :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

इसे कहा जाता है convert.c#crlf_to_git(), स्वयं द्वारा बुलाया जाता है convert.c#convert_to_git(), स्वयं द्वारा बुलाया जाता हैconvert.c#renormalize_buffer()

और वह अंतिम renormalize_buffer()ही कहलाता हैmerge-recursive.c#blob_unchanged()

इसलिए मुझे संदेह है कि यह रूपांतरण ए पर होता है git commit केवल तभी जब कहा जाए कि यह एक मर्ज प्रक्रिया का हिस्सा है।


नोट: Git 2.17 (Q2 2018) के साथ, एक कोड क्लीनअप कुछ स्पष्टीकरण जोड़ता है।

Torsten Bögershausen ( ) द्वारा प्रतिबद्ध 8462ff4 (13 जनवरी 2018) देखें । ( जूनियो सी हमानो द्वारा विलय - - में 9bc89b1 , 13 फरवरी 2018 को)tboegi
gitster

Convert_to_git (): safe_crlf / checkafe int conv_flags हो जाता है

कॉल करते समय convert_to_git(), checksafeपैरामीटर परिभाषित करता है कि क्या होना चाहिए अगर ईओएल रूपांतरण ( CRLF --> LF --> CRLF) सफाई से गोल नहीं करता है।
इसके अलावा, यह भी परिभाषित किया जाता है कि क्या लाइन एंडिंग को फिर से असामान्य किया जाना चाहिए (CRLF --> LF ) या उन्हें रखा जाए।

चेक safe_crlfइन मूल्यों के साथ एक एनफोम था :

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

ध्यान दें कि 8462ff4 (" convert_to_git(): " safe_crlf/checksafeबन जाता है int conv_flags", 2018-01-13, Git 2.17.0) में एक प्रतिगमन Git 2.17 चक्र में वापस सेट करने के बावजूदautocrlf चेतावनी संदेश उत्पन्न करने के लिए पुनर्लेखन का कारण बना।safecrlf=false

एंथोनी Sottile ( ) द्वारा प्रतिबद्ध 6cb0912 (04 जून 2018) देखें । ( जूनियो सी हमानो द्वारा विलय - - ff०६३ ९ ० ९, २8 जून २०१io में )asottile
gitster


1
हां, अधिकांश संपादक ईओएल शैली को संरक्षित कर सकते हैं, लेकिन अधिकांश संपादकों के पास, उसी परियोजना में एक नई फ़ाइल बनाते समय कोई प्रभाव नहीं होता है। सुनिश्चित करें कि आप एक एलएफ परियोजना की जांच नहीं करते हैं, "पीएस, मेरे संपादक एलएफ लाइन एंडिंग को संभाल सकते हैं, मुझे लगता है कि मुझे ऑटोक्रॉफ्ट की जरूरत नहीं है", और फिर एलएफ लाइन एंडिंग के लिए नई फाइलें मैन्युअल रूप से सेट करना भूल जाएं।

15
@VonC मुझे स्वीकार करना चाहिए कि मैं नहीं मिल रहा हूँ। Git-Book बताता है कि Git आपके द्वारा प्रतिबद्ध होने पर LRL में CRLF लाइन एंडिंग को ऑटो-कन्वर्सेशन द्वारा हैंडल कर सकता है और इसके विपरीत जब यह आपके फाइलसिस्टम पर कोड की जाँच करता है। इसका मतलब है कि पर प्रतिबद्ध करने के लिए एक रूपांतरण होगी वामो और कभी नहीं करने के लिए CRLF । जिसका अर्थ है कि उल्लिखित चेतावनी गलत है। बीत रहा core.autocrlf=trueहोगा हमेशा रेपो में वामो में उपज है, और काम कर पेड़ imho में CRLF (यहां तक कि गैर- Windows के तहत)। स्रोत: लिंक
क्वालाल

12
"इस चेतावनी पूंछ पिछड़े है? यह केवल चेकआउट पर घटित होता है तो" मैं पर इस सटीक चेतावनी देख रहा हूँ के लिए प्रतिबद्ध । तो हाँ , यह पिछड़ा हुआ है। इसने मुझे इस खोज के लिए प्रेरित किया। खुशी है कि दूसरों ने भी इसे देखा! यह लोगों को बहुत भ्रमित कर रहा है कि वास्तव में इन चेतावनियों को यह देखने के लिए पढ़ें कि यह एक प्रतिबद्ध संदेश पर CRLF में बदल जाएगा।
Stijn de Witt

7
"तो मुझे संदेह है कि यह रूपांतरण एक जीआईटी कमिट पर होता है, यदि कहा जाए कि यह कमिट मर्ज प्रक्रिया का हिस्सा है।" नहीं। मैं इसे नियमित तौर पर देख रहा हूं।
स्टिज डे विट

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

27

हाँ चेतावनी पीछे की ओर है।

और वास्तव में यह पहली जगह में भी चेतावनी नहीं होनी चाहिए। क्योंकि यह सब चेतावनी कह रही है (लेकिन दुर्भाग्य से पीछे) यह है कि विंडोज लाइन एंडिंग के साथ आपकी फ़ाइल में CRLF वर्णों को LF की ओर से बदल दिया जाएगा। इसका मतलब है कि यह उसी लाइन एंडिंग के लिए सामान्यीकृत है जो * nix और MacOS द्वारा उपयोग किया जाता है।

कुछ भी अजीब नहीं चल रहा है, यह वही व्यवहार है जो आप सामान्य रूप से चाहते हैं।

वर्तमान रूप में यह चेतावनी दो चीजों में से एक है:

  1. एक दुर्भाग्यपूर्ण बग एक अति सतर्क चेतावनी संदेश के साथ संयुक्त, या
  2. एक बहुत चालाक साजिश के माध्यम से आप वास्तव में यह सोचने के लिए ...

;)


1
यह अजीब है कि यदि आप विंडोज पर स्थानीय फ़ाइलों को जबरन रूपांतरित करते हैं तो LF में आप फ़ाइलों को जोड़ नहीं सकते, संदेश आपकी प्रतिबद्धता की शिकायत करता है।
phpguru

24

- 9 जुलाई को ---

@Mgiuca द्वारा टिप्पणी के रूप में हटा दिया गया "यह सही और सटीक है"

======

सं । यह वर्तमान में आपकी फ़ाइलों के बारे में बात नहीं कर रहा है CRLF। इसके बजाय फाइलों के बारे में बात कर रहा है LF

इसे पढ़ना चाहिए:

चेतावनी: ( यदि आप इसकी जांच करते हैं / या अपने वर्तमान कोर के साथ किसी अन्य फ़ोल्डर में क्लोन करते हैं। कॉउंट्रॉफ़ कॉन्फ़िगरेशन ,) LF को CRLF द्वारा प्रतिस्थापित किया जाएगा

फ़ाइल में आपकी ( वर्तमान ) कार्यशील निर्देशिका में इसकी मूल पंक्ति अंत होगी ।

इस चित्र को यह बताना चाहिए कि इसका क्या अर्थ है। यहां छवि विवरण दर्ज करें


1
अच्छा चित्रण। +1। अधिक दृश्यता के लिए मैंने आपके उत्तर का उल्लेख किया है।
वॉन

मेरे लिए क्या अच्छा काम करता है: 1) इंटेलीज सेट लाइन सेपरेटर (\ n) में core.autocrlf = false 2)। मैं मैक और विंडोज दोनों पर इंटेलीज आइडिया का उपयोग करता हूं।
जिओ पेंग - ZenUML.com

यह तब हो सकता है जब फ़ाइल विंडोज में बनाई गई थी, लेकिन इसमें एक यूनिक्स / मैक लाइन एंडिंग (एलएफ) है और आपकी गिट कॉन्फिग प्रॉपर्टी ऑटोक्रॉफ्ट सच है। अनिवार्य रूप से गिट आपके द्वारा बनाई गई फ़ाइल को बदलने नहीं जा रहा है, लेकिन यह इसे बाहर की जाँच करेगा / इसे विंडोज़ लाइन एंडिंग के साथ क्लोन (क्योंकि आपके ऑटोक्रॉफ्ट सेटिंग)
पैट्रिक

1
अगर आपको इसे "अपने वर्तमान core.autocrlf कॉन्फ़िगरेशन के साथ किसी अन्य फ़ोल्डर में चेक आउट / या क्लोन करना है" तो इसे योग्य बनाने के लिए चेतावनी को सही और सटीक कैसे कहा जाता है। यह वह नहीं है जो मूल संदेश कहता है। यह कहता है कि यह नहीं होगा (CRLF द्वारा प्रतिस्थापित नहीं किया जा सकता है), इसका अर्थ है कि इसे CRLF मोड में रेपो में ही संग्रहीत किया जाएगा, न कि कुछ काल्पनिक भविष्य के चेकआउट में।
मागुका

12

यह सब मानते हैं core.autocrlf=true

मूल त्रुटि:

चेतावनी: LF को CRLF द्वारा प्रतिस्थापित किया
जाएगा। फ़ाइल की मूल पंक्ति आपकी कार्यशील निर्देशिका में होगी।

क्या त्रुटि पढ़ी जानी चाहिए:

चेतावनी: LF को आपके कार्यशील निर्देशिका में CRLF द्वारा प्रतिस्थापित किया
जाएगा। फ़ाइल में मूल भंडार में अपनी मूल LF पंक्ति अंत होगी

यहाँ स्पष्टीकरण :

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

असल में, एक स्थानीय फ़ाइल जो पहले LF थी, अब स्थानीय रूप से CRLF होगी


7

git config --global core.autocrlf false वैश्विक सेटिंग्स के लिए अच्छी तरह से काम करता है।

लेकिन अगर आप विजुअल स्टूडियो का उपयोग कर रहे हैं, तो आपको .gitattributesकुछ प्रकार की परियोजनाओं के लिए संशोधित करने की भी आवश्यकता हो सकती है ( जैसे सी # क्लास लाइब्रेरी एप्लिकेशन ):

  • लाइन हटा दें * text=auto

1

के बाद मैंने सेट किया core.autocrlf=true रहा था तब मुझे "LF को CRLF द्वारा प्रतिस्थापित किया जाएगा" (ध्यान दें कि "CRLF को LF द्वारा प्रतिस्थापित नहीं किया जाएगा") जब मैं git addआईएनजी था (या शायद यह चालू था git commit?) एक रिपॉजिटरी पर खिड़कियों में फ़ाइलों को संपादित किया (जो कि उपयोग कर रहे हैं) LF) जिसे मैंने सेट करने से पहले चेक किया थाcore.autocrlf=true

मैंने एक नया चेकआउट किया core.autocrlf=true और अब मुझे वे संदेश नहीं मिल रहे हैं।


0

यदि आप Visual Studio 2017, 2019 का उपयोग कर रहे हैं, तो आप कर सकते हैं:

  1. मुख्य .itignore को खोलें (समाधान में अन्य प्रोजेक्ट्स में। anaignignore फ़ाइलों को अपडेट करें या हटाएं)
  2. नीचे दिए गए कोड को चिपकाएँ:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
यह "कोड" ऐसा लगता है जैसे यह एक कॉन्फ़िगर फ़ाइल में होना चाहिए .gitconfigया .git/configनहीं .gitignore, जो कि फ़ाइलों को गिट द्वारा अनदेखा करने के लिए निर्दिष्ट करता है।
दाविद

मैंने इसे .it / config में जोड़ा लेकिन फिर भी "चेतावनी: CRLF को LF द्वारा प्रतिस्थापित किया जाएगा" प्रकट होता है
सर्गेई

0

बस सरल काम करो:

  1. Git-hub (Shell) खोलें और डायरेक्टरी फ़ाइल में नेविगेट करें (cd / a / b / c / ...)
  2. निष्पादित करें dos2unix (कुछ समय dos2unix.exe)
  3. अभी प्रयास करें। यदि आपको फिर से वही त्रुटि मिलती है। Dos2unix के बजाय उपरोक्त सभी चरणों को पूरा करें, कुछ समय बाद unix2dox (unix2dos.exe) करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.