गिट रेपो और वर्किंग कॉपी में फोर्स एलएफ ईओएल


170

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

मैं अब लिनक्स पर आंशिक रूप से विकास कर रहा हूं, और मैं लाइन एंडिंग्स को साफ करना चाहूंगा। मैं यह सुनिश्चित कर सकता हूं कि गिटहब पर एलएफ के साथ फाइलें सही तरीके से संग्रहीत हैं, और मेरी काम की प्रतिलिपि में एलएफ है?

मैंने एक .gitattributesफ़ाइल युक्त सेट की है text eol=LF; क्या वो सही है? उस प्रतिबद्ध और धक्का के साथ, क्या मैं rmवांछित प्रभाव प्राप्त करने के लिए सिर्फ अपने स्थानीय रेपो और जीथब से फिर से क्लोन कर सकता हूं ?




उनमें से न तो मैं क्या पूछ रहा हूँ काफी है। मैं एकमात्र डेवलपर हूं, और मैं अपनी सभी मशीनों को एक समान स्थापित करने के लिए काफी इच्छुक हूं। मेरे पास कुछ मौजूदा CRLF फ़ाइलों के साथ एक मौजूदा रेपो है, और विभिन्न मशीनों पर कुछ क्लोन हैं। मैं रेपो, और प्रत्येक कार्य प्रतिलिपि को कैसे अपडेट कर सकता हूं, ताकि हर जगह एलएफ हो?
चौलेट

क्या आपने इस गितुब गाइड को देखा है ?
एंडी

जवाबों:


237

आपकी रिपॉजिटरी (शुद्ध स्रोत कोड, चित्र, निष्पादन योग्य, ...) में कौन सी फाइलें हैं, इस बारे में थोड़ी जानकारी के बिना, प्रश्न का उत्तर देना थोड़ा कठिन है :)

इसके अलावा, मैं विचार करूंगा कि आप LF को अपने कार्यशील निर्देशिका में लाइन एंडिंग के रूप में डिफ़ॉल्ट करने के लिए तैयार हैं क्योंकि आप यह सुनिश्चित करने के लिए तैयार हैं कि पाठ फ़ाइलों में आपके .it रिपॉजिटरी वेदर में LF लाइन एंडिंग्स हैं जो आप विंडोज या लिनक्स पर काम करते हैं। । वास्तव में क्षमा से बेहतर सुरक्षित ...।

हालाँकि, एक बेहतर विकल्प है: अपने लिनक्स वर्कडिर में LF लाइन एंडिंग्स से लाभ, अपने विंडोज वर्कडायर में CRLF लाइन एंडिंग्स और अपने रिपॉजिटरी में LF लाइन एंडिंग्स से लाभ उठाएँ।

जैसा कि आप आंशिक रूप से लिनक्स और विंडोज पर काम कर रहे हैं, सुनिश्चित करें core.eolकि सेट किया गया है nativeऔर core.autocrlfइसे सेट किया गया है true

फिर, अपनी .gitattributesफ़ाइल की सामग्री को निम्न के साथ बदलें

* text=auto

यह Git को कमिट और चेकआउट पर आपके लिए ऑटोमैटिक लाइन एंडिंग्स रूपांतरण को संभालने देगा। बाइनरी फ़ाइलों को परिवर्तित नहीं किया जाएगा, पाठ फ़ाइलों के रूप में पाई गई फ़ाइलों को फ्लाई पर परिवर्तित लाइन एंडिंग दिखाई देगी।

हालाँकि, जैसा कि आप अपनी रिपॉजिटरी की सामग्री को जानते हैं, आप Git को एक हाथ दे सकते हैं और उसे बाइनरी फ़ाइलों से पाठ फ़ाइलों का पता लगाने में मदद कर सकते हैं।

बशर्ते आप C आधारित छवि प्रसंस्करण परियोजना पर काम करें, अपनी .gitattributesफ़ाइल की सामग्री को निम्न के साथ बदलें

* text=auto
*.txt text
*.c text
*.h text
*.jpg binary

यह सुनिश्चित करेगा कि जो फाइलें c, h, या txt हैं, वे आपके रेपो में LF लाइन एंडिंग के साथ संग्रहित होंगी और वर्किंग डायरेक्टरी में देशी लाइन एंडिंग होंगी। Jpeg फाइलें नहीं छुई जाएंगी। अन्य सभी को उसी स्वचालित फ़िल्टरिंग से लाभ होगा जैसा कि ऊपर देखा गया है।

इस सब के आंतरिक विवरण की गहन समझ प्राप्त करने के लिए, मैं आपको सुझाव दूंगा कि टिम क्ल्म, एक गिथबर से इस बहुत अच्छी पोस्ट "अपनी पंक्ति के अंत में मन लगाएं"।

एक वास्तविक दुनिया उदाहरण के रूप में, आप इस कमिट में भी देख सकते .gitattributesहैं कि फ़ाइल में उन परिवर्तनों का प्रदर्शन किया गया है।

निम्नलिखित टिप्पणी पर विचार कर उत्तर को अद्यतन करें

मैं वास्तव में अपने विंडोज निर्देशिकाओं में CRLF नहीं चाहता, क्योंकि मेरा लिनक्स वातावरण वास्तव में विंडोज निर्देशिका साझा करने वाला एक वर्चुअलबॉक्स है

समझ में आता है। स्पष्टीकरण के लिए धन्यवाद। इस विशिष्ट संदर्भ में, अपने आप .gitattributesफ़ाइल पर्याप्त नहीं होगी।

अपनी रिपॉजिटरी के खिलाफ निम्न कमांड चलाएँ

$ git config core.eol lf
$ git config core.autocrlf input

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

वैकल्पिक रूप से, आप Git को यह बताने में मदद कर सकते हैं कि एक टेक्स्ट फाइल क्या है,.gitattributes जिसमें निम्नलिखित के समान एक फाइल बनाई जा सकती है :

# Autodetect text files
* text=auto

# ...Unless the name matches the following
# overriding patterns

# Definitively text files 
*.txt text
*.c text
*.h text

# Ensure those won't be messed up with
*.jpg binary
*.data binary

यदि आपने एक .gitattributesफ़ाइल बनाने का फैसला किया है , तो इसे प्रतिबद्ध करें

अंत में, git statusउल्लेख करें कि "कुछ भी नहीं करने के लिए प्रतिबद्ध है (निर्देशिका साफ कर रही है)" , फिर निम्नलिखित ऑपरेशन करें

$ git checkout-index --force --all

यह आपकी कार्यशील निर्देशिका में आपकी फ़ाइलों को फिर से बनाएगा, आपके कॉन्फ़िगरेशन परिवर्तनों और .gitattributesफ़ाइल को ध्यान में रखेगा और आपके पाठ फ़ाइलों में किसी भी संभावित अनदेखी CRLF की जगह लेगा।

एक बार यह पूरा हो जाने के बाद, आपकी वर्किंग डायरेक्टरी की प्रत्येक टेक्स्ट फाइल LF लाइन एंडिंग को सहन git statusकर लेगी और फिर भी कार्यदिवस को स्वच्छ समझना चाहिए।


34
मैं वास्तव में अपनी विंडोज निर्देशिकाओं में CRLF नहीं चाहता, क्योंकि मेरा लिनक्स वातावरण वास्तव में विंडोज निर्देशिका साझा करने वाला एक वर्चुअलबॉक्स है; और जबकि नोटपैड ++ आदि एलएफएफ को केवल विंडोज पर संभाल सकते हैं, viसीआरएलएफ से कम खुश हैं। मैं सिर्फ इतना है कि यह बदलना चाहते हैं core.autocrlfहै false(या input)?
चौलेट 7

5
बहुत बढ़िया जवाब। इस सेटअप का उपयोग करने वाले किसी अन्य व्यक्ति के लिए एक त्वरित नोट: लाइन "* टेक्स्ट = ऑटो" आपकी .gitattributes फ़ाइल में पहली पंक्ति होनी चाहिए ताकि बाद की लाइनें उस सेटिंग को ओवरराइड कर सकें।
अरी पैट्रिक

9
@CMCDragonkai आपके शेल के आधार पर, git checkout-index --force --allबेहतर काम कर सकता है। मूल प्रश्न के संबंध में दूसरा बिंदु थोड़ा हटकर है। एक समर्पित प्रश्न पूछने के बारे में कैसे?
nulltoken

8
मुझे समझ में नहीं आ रहा है कि .gitattributes लिनक्स और विंडोज के बीच काम की कॉपी साझा करने के मामले को क्यों नहीं संभाल सकता है। क्या हम सेट नहीं कर सकते हैं textऔर eol=lfउसी परिणाम को प्राप्त कर सकते हैं जो आपके उत्तर में core.eolऔर के माध्यम से वर्णित है core.autocrlf?
डैनियलस्कंक

10
git checkout-index --force --allमेरे लिए कुछ नहीं करता है। इस मुद्दे से निपटने के लिए GitHub निर्देशों में आदेशों की सूची क्या काम करती है ।
रोमन स्टारकोव

126

2.10 git (2016-09-03 को जारी) के साथ शुरू, प्रत्येक पाठ फ़ाइल को अलग से एन्यूमरेट करना आवश्यक नहीं है। Git 2.10 ने eol = lf के साथ मिलकर टेक्स्ट = ऑटो का व्यवहार तय कियास्रोत

.gitattributes अपने git रिपॉजिटरी की जड़ में फ़ाइल:

* text=auto eol=lf

जोड़ें और इसे प्रतिबद्ध करें।

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

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

स्रोत: kenorb द्वारा उत्तर


7
Git 2.10 3 सितंबर 2016 को जारी किया गया है।
stil

मैंने इसे चलाया और इसने मेरी सभी गैर-पाठ फाइलों को बंद कर दिया
एंथनी

आप कुछ फ़ाइलों के लिए बाइनरी मोड को स्पष्ट रूप से सेट कर सकते हैं। - मुझे आश्चर्य है कि कुछ फाइलों पर ऑटो डिटेक्शन (अभी भी?) टूटा हुआ है
23

यह स्वीकृत उत्तर होना चाहिए।
क्लेटसडब्ल्यू

25

सभी पाठ फ़ाइलों के लिए LF लाइन एंडिंग को बाध्य करने के लिए, आप .gitattributesनिम्न पंक्तियों (वांछित के रूप में परिवर्तन) के साथ अपने भंडार के शीर्ष-स्तर में फ़ाइल बना सकते हैं :

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

जो यह सुनिश्चित करता है कि Git को पाठ फ़ाइलों के रूप में माना जाने वाली सभी फ़ाइलों LFको रिपॉजिटरी (सामान्य रूप से core.eolकॉन्फ़िगरेशन नियंत्रण जो आपके पास डिफ़ॉल्ट रूप से होता है) में लाइन एंडिंग सामान्य हो गई है।

नई विशेषता सेटिंग्स के आधार पर, CRLF युक्त किसी भी टेक्स्ट फाइल को Git द्वारा सामान्य किया जाना चाहिए। यदि यह स्वचालित रूप से नहीं होगा, तो आप लाइन एंडिंग को बदलने के बाद मैन्युअल रूप से एक रिपॉजिटरी को रीफ्रेश कर सकते हैं, इसलिए आप निम्न चरणों द्वारा काम की निर्देशिका को फिर से स्कैन और प्रतिबद्ध कर सकते हैं (दी गई स्वच्छ कार्य निर्देशिका)

$ echo "* text=auto" >> .gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

या GitHub डॉक्स के अनुसार :

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

यह भी देखें: @Charles बेली पोस्ट

इसके अलावा, यदि आप किसी भी फाइल को पाठ के रूप में नहीं माना जाना चाहते हैं, तो उनके पाठ विशेषता को परेशान न करें, जैसे

manual.pdf      -text

या इसे बाइनरी के रूप में स्पष्ट रूप से चिह्नित करें:

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

कुछ और उन्नत git सामान्यीकरण फ़ाइल देखने के लिए .gitattributes, Drupal core पर देखें :

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

यह सभी देखें:


2
1. text=autoभ्रामक है। आप उपयोग नहीं कर सकते हैं text=autoऔर eolएक साथ। सेटिंग eolपाठ फ़ाइलों के स्वचालित पहचान अक्षम करता है। यही कारण है कि आपको उन सभी फ़ाइल प्रकारों को निर्दिष्ट करना होगा। यदि autoसक्षम किया गया था, तो आपको उस सब की आवश्यकता नहीं होगी। 2. आप की जरूरत नहीं है textऔर eol=lfeol=lfप्रभावी ढंग से सेट करता है text
बेन

2
2 क्या @ @ ने कहा, यदि आप सभी बाइनरी फ़ाइलों को स्पष्ट रूप से चिह्नित नहीं करते हैं, तो यह कॉन्फ़िगरेशन वर्तमान में गलत और खतरनाक है।
माइकल आर

1
मैंने पढ़ा है कि * text=auto eol=lfपहला text=autoओवरराइड है eol=lf। आपको यह सुविधा कहां से मिली? यहाँ मेरा स्रोत है: stackoverflow.com/questions/29435156/…
CMCDragonkai

निकाला गया * text=auto eol=lfहै, उदाहरण के से के बाद से यह किया गया था हटा दिया और साथ ही Drupal से। टिप्पणियों को हटाने पर भी विचार करें।
kenorb

4
यह नोट करना महत्वपूर्ण है कि @ ने कहा कि अब सच नहीं है और यह हमेशा बग था - एक इच्छित व्यवहार नहीं।
सेमेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.