जीआईटी ईओएल रूपांतरणों को अक्षम करें


100

मैं कोशिश कर रहा हूं कि किसी भी ऑपरेशन के लिए कोई भी लाइन एंडिंग नहीं बदलने की कोशिश की जाए। दुर्भाग्य से, ऐसा लगता है कि ऐसा नहीं है। मैंने इसे निम्न परीक्षण मामले में कम कर दिया है, जिसमें इस व्यवहार को अक्षम करने के लिए कई अलग-अलग तंत्र हैं जैसा कि मुझे मिल सकता है।


  • दो मशीनों (विंडोज कंप्यूटर = ए, लिनक्स कंप्यूटर = बी) से शुरू करें
  • दोनों मशीनों पर: git config --global core.autocrlf false
  • दोनों मशीनों पर: git config --global core.eol crlf(बस मामले में)

  • खाली फ़ोल्डर से A. पर नया भंडार बनाएं:
    • git init --shared(तब बनाई गई .gitनिर्देशिका को अनसाइड करें )
    • .gitignoreरिपॉजिटरी में एक नई फाइल बनाएं
    • .gitattributesएकल पंक्ति के साथ भंडार में एक नई फ़ाइल बनाएँ :* -text
    • git add ., तो git commit -m "initial commit", आस-पास काम करने के लिए जैसे यह
    • git branch master_recv
    • उपाय जोड़ें
  • document.txtCRLF युक्त रिपॉजिटरी में एक नई फ़ाइल बनाएँ
  • कमिट: git add -Aतबgit commit -m "<something>"
  • ध्यान दें कि A में document.txtअभी भी CRLF मौजूद है (और इसे डिलीट कर रहा है और --hardCRLF के साथ अभी भी संस्करण को वापस लौटा रहा है)

  • कंप्यूटर B को पूरी निर्देशिका SCP
  • new fileCRLF युक्त एक नई फ़ाइल जोड़ें
  • कमिट: git add -Aतबgit commit -m "<something>"
  • ध्यान दें कि B document.txtऔर B new fileदोनों में अभी भी CRLF है

  • पुल बी के मास्टर को A: git pull <remote> master:master_recv
  • A document.txtको LF में बदल दिया है। अतिरिक्त फ़ाइल new fileमें LF भी है।

यदि B एक Windows मशीन है तो समस्या उत्पन्न नहीं होती है।


गया है core.autocrlf हमेशा झूठे किया गया? ऐसा लगता है कि आपके पास \nअपने भंडार में पहले से ही लाइन अंत है? नहीं है कोई परिवर्तन करने के लिए सेटिंग \nकरने के लिए अपने भंडार में \r\nअपने काम निर्देशिका में।
एडवर्ड थॉमसन

यह हमेशा सेट नहीं किया गया है (उदाहरण के लिए जब रेपो मूल रूप से बनाया गया था)। हालांकि, रेपो में पहले से ही कोई सीआर लाइन अंत नहीं होना चाहिए। इसके अलावा, फिर से, मैं नहीं चाहता कि कोई भी बदलाव हो।
imallett

मैं पूछता हूं क्योंकि आपके सेटअप को सीआरएलएफ के रूप में अपनी लाइन के अंत को संरक्षित करना चाहिए । क्या आप अपनी वस्तु आईडी के साथ अपनी रिपॉजिटरी में कुछ फ़ाइल पोस्ट कर सकते हैं मेरे लिए (केवल संभवतः कष्टप्रद) एडिटिंग?
एडवर्ड थॉमसन

@EdwardThomson आपका क्या मतलब है? रेपो सार्वजनिक नहीं है (चूंकि लिनक्स मशीन नहीं है)। मैं मान लूंगा कि आप एक उदाहरण फ़ाइल चाहते हैं। संपादित देखें।
imallett

हां, मैं मानता हूं कि उस फ़ाइल में CRLF लाइन एंडिंग्स हैं। क्या आप एक बात स्पष्ट कर सकते हैं: आपने उल्लेख किया है कि "विंडोज़ मशीन की नई रूपरेखा सीआर में बदल जाती है!" निश्चित रूप से यह एक टाइपो था, या क्या आप वास्तव में मैक ओएस 9-शैली की गाड़ी वापसी लाइन अंत कर रहे हैं?
एडवर्ड थॉमसन

जवाबों:


74

आपके प्रोजेक्ट के अंदर, एक .gitattributesफाइल होनी चाहिए । ज्यादातर समय, यह नीचे (या इस स्क्रीन-शॉट ) की तरह दिखना चाहिए :

# Handle line endings automatically for files detected as text 
# and leave all files detected as binary untouched.
* text=auto

# Never modify line endings of our bash scripts
*.sh -crlf

#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
*.css           text
*.html          text
*.java          text
*.js            text
*.json          text
*.properties    text
*.txt           text
*.xml           text

# These files are binary and should be left untouched
# (binary is macro for -text -diff)
*.class         binary
*.jar           binary
*.gif           binary
*.jpg           binary
*.png           binary

स्वचालित हैंडलिंग अक्षम * text=autoकरने के * text=falseलिए बदलें ( स्क्रीन-शॉट देखें )।

ऐशे ही:

यहां छवि विवरण दर्ज करें

यदि आपके प्रोजेक्ट में .gitattributes फ़ाइल नहीं है, तो लाइन अंत आपके git कॉन्फ़िगरेशन द्वारा निर्धारित किए जाते हैं। अपने गिट कॉन्फ़िगरेशन को बदलने के लिए, यह करें:

इस निर्देशिका में विन्यास फाइल पर जाएँ:

1) C: \ ProgramData \ Git \ config

2) नोटपैड ++ (या जो भी पाठ संपादक आपको पसंद है) में कॉन्फिग फ़ाइल खोलें

3) "ऑटोक्रेट =" को असत्य में बदलें।

यहां छवि विवरण दर्ज करें


31
कोड टैग के बजाय चित्रों का उपयोग क्यों करें? बहुत असुविधाजनक
क्लिंट

31
क्योंकि मैं सामान को उजागर करने के लिए तस्वीर में एक बड़ा लाल बॉक्स जोड़ सकता हूं।
जीन

21
* text=falseपाठ का उपयोग नहीं करता है: यह स्ट्रिंग मान को गलत पर सेट पाठ छोड़ता है। पाठ को अनिर्दिष्ट (विशेष रूप से परेशान नहीं) छोड़ने जैसा ही प्रभाव पड़ता है। उपयोग करने * -textसे यह विशेष परेशान सेटिंग देता है। एक पथ पर पाठ विशेषता को परेशान करना बताता है कि चेकइन या चेकआउट पर किसी भी अंत-लाइन रूपांतरण का प्रयास नहीं करना है।
जस्टमार्टिन

इस उत्तर के लिए धन्यवाद @Gene। यह मुझे पूरे दिन पागल कर रहा है, और इसने इसे मेरे लिए हल कर दिया है!
लेपर्सस्किनपिलबॉक्सहैट

7
क्षमा करें कि मैं इस उत्तर के लिए धन्यवाद नहीं कह सकता। मुझे यह जानने के लिए आधे दिन का समय लगता है कि किसी ने भ्रामक सलाह का पालन किया था। जैसा कि @JustAMartin ने बताया कि * text=falseइसका कोई असर नहीं हुआ। कृपया जवाब तय करें!
पॉल बी।

47

एक सरल उपाय है:

  • सुनिश्चित करें कि core.autocrlf सभी repos के लिए गलत पर सेट है :
    git config --global core.autocrlf false
  • अपने रेपो को फिर से क्लोन करें, और चेक करें कि कोई ईओएल रूपांतरण नहीं हुआ है।
  • या, Git 2.16 (Q1 2018) के बाद से , अपना वर्तमान रेपो रखें, और agit add --renormalize .

यदि स्वचालित रूप से रूपांतरण होते हैं, तो इसका मतलब है कि रेपो के भीतर एक .gitattributes core.eolनिर्देश है।

साथ Git 2.8+ (मार्च 2016) , जाँच वहाँ अभी भी साथ EOL परिवर्तन कर रहे हैं:

git ls-files --eol

2
बस नहीं autocrlfआज का उपयोग करें ! परेशान नहीं autocrlfके बराबर है false। आप Git
Lazy Badger

1
ऊपर के रूप में, मैंने यह कोशिश की थी (हालांकि वैश्विक ध्वज के साथ नहीं), और यह काम नहीं किया। Git संस्करण है 1.8.5.2
imallett

@IanMallett "इस बिंदु पर, यह प्रतीत होता है कि लिनक्स मशीन में अभी भी CRLF है": यह तब तक रहेगा जब तक आप इसकी सामग्री को फिर से सामान्य नहीं कर लेते, या इसे क्लोन नहीं कर सकते (जैसे कि आपने खिड़कियों पर किया था)
VONC

11

मैं यह समझ गया। ऐसा लगता है कि एससीपी कार्यक्रम लाइन एंडिंग को परिवर्तित कर रहा था। मैंने इस पर ध्यान दिया जब मैंने जानबूझकर एलएफ एंडिंग के साथ एक फाइल बनाने की कोशिश की और फिर देखा कि यह डाउनलोड होने पर सीआरएलएफ के रूप में दिखाई दिया।

चूंकि यह मेरे लिए समाधान था, इसलिए मैं इस उत्तर को स्वीकार कर रहा हूं, लेकिन भविष्य के लोगों को अन्य जवाबों को अधिक सामान्य समाधान के लिए भी संदर्भित करना चाहिए।


1
अच्छी पकड़, मेरे उत्तर से अधिक विशिष्ट। +1
VonC

4

से gitattributes (5) मैनुअल पृष्ठ "प्रभाव" विषय

text

यह विशेषता एंड-ऑफ-लाइन सामान्यीकरण को सक्षम और नियंत्रित करती है। जब एक टेक्स्ट फ़ाइल को सामान्य किया जाता है, तो उसकी लाइन एंडिंग रिपॉजिटरी में LF में बदल जाती है। वर्किंग डायरेक्टरी में किस लाइन एंडिंग स्टाइल का उपयोग किया जाता है, इसे नियंत्रित करने के eolलिए, एक फाइल के लिए विशेषता और core.eol सभी टेक्स्ट फाइलों के लिए कॉन्फ़िगरेशन चर का उपयोग करें।

Set

किसी पथ पर पाठ विशेषता सेट करने से अंत-लाइन सामान्यीकरण सक्षम होता है और पथ को पाठ फ़ाइल के रूप में चिह्नित करता है। सामग्री प्रकार का अनुमान लगाए बिना एंड-ऑफ-लाइन रूपांतरण होता है।

Unset एक पथ पर पाठ विशेषता को परेशान करना बताता है कि चेक या चेकआउट पर किसी भी अंत-लाइन रूपांतरण का प्रयास न करें।

core.autocrlfin new (1.7.2+) Git का उपयोग नहीं किया गया, core.eolऔर सही सेटिंग | पाठ-विशेषता का परेशान होना अधिक विश्वसनीय तरीका माना जाता है


में .gitattributesफ़ाइल, मैं पाठ हालांकि, अधिकार के रूप में स्पष्ट रूप से विकलांग सब कुछ था? इसके अलावा, मैं इसे रूपांतरण नहीं करने के विकल्प के साथ नहीं देखता (हालांकि crlfइसका कोई प्रभाव नहीं हो सकता है)?
imallett

6
महत्वपूर्ण बात जो अक्सर भ्रमित हो जाती है - textकिसी भी रूपांतरण को परेशान करने और रोकने के लिए, आपको .gitattributes को सेट करना चाहिए * -text और नहीं करना चाहिए * text=false। विशेषता के falseलिए एक मान्य मान नहीं है text- git इसे पहचान नहीं पाएगा और इसके बजाय अपने डिफ़ॉल्ट ऑटोक्रॉफ्ट सेटिंग पर वापस आ जाएगा। इसके अलावा, textमूल्य बदलने के बाद आपको अपने स्थानीय रेपो से सभी फ़ाइलों का बैकअप लेना होगा, एक कमिट करना होगा, फिर सही एंड-ऑफ़-लाइन्स वाली फ़ाइलों को पुनर्स्थापित करना चाहिए, जैसे कि आपको उनकी आवश्यकता है, और उन्हें वापस करें। फिर आपकी अंत-पंक्तियों को फिर से गिट द्वारा संशोधित नहीं किया जाएगा।
जस्टआमर्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.