Git स्टेटस लाइन एंडिंग / समान फाइल्स / विंडो और लिनक्स एनवायरनमेंट / ड्रॉपबॉक्स / मल्ड को अनदेखा करता है


112

मैं कैसे बनाऊं

गिट की स्थिति

मतभेद खत्म करने वाली रेखा की अनदेखी?

पृष्ठभूमि की जानकारी:

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

मैंने इस बारे में बहुत कुछ पाया कि कैसे लाइन अंत को अनदेखा करते हैं। चूंकि मैं मेल्ट जीट का उपयोग करता हूं, इसलिए प्रत्येक फाइल के लिए मेल्ड मेल खुलता है। और meld कहते हैं "समान फ़ाइल"।

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

संपादित करें: कारण:

विंडोज पर इस सेटिंग के कारण ऐसा हुआ

core.autocrlf true है

इसलिए मैंने लिनक्स पर काम करने वाली कॉपी की जाँच की और विंडोज पर core.autocrlf को झूठा सेट किया।

यह जानना अभी भी अच्छा होगा कि कैसे git स्टेटस को अलग-अलग नई लाइनों को अनदेखा किया जाए।


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

आप पर ध्यान दें: stackoverflow.com/questions/2825428/… - इससे कुछ हद तक मदद मिल सकती है
पेटेश

मुझे पता चला कि यह ड्रॉपबॉक्स के साथ कैसे अच्छा काम करता है: core.autocrlf false करके
Thorsten Niehues

3
AFAIK बता रही है कि git को बाइनरी के रूप में माना जाता है और फ़ाइल को अलग करने के तरीके को बदलने का दुष्प्रभाव भी है। उचित समाधान यह है कि लाइन एंडिंग को अनदेखा करने के लिए गिट को बताएं। मेरी कम से कम पसंदीदा चीज़ों में से 2: लाइन खत्म होने की समस्या और अनावश्यक चुभन FUD से निपटने के तरीके के बारे में लोगों ने अपने
रिपॉज

वाह, मुझे थोड़ी देर लगी कि इस समस्या core.autocrlfके लिए विंडोज पर मूल कारण है, लेकिन लिनक्स पर एक इलाज भी है। समस्या यह है, autocrlfविंडोज पर वैश्विक है, और रेपो में वह सेटिंग नहीं है .git/config। एक स्थानीय चलाकर git config core.autocrlf trueमैंने अपने NTFS पर काम करने वाली विदुषी बदलावों से छुटकारा पाया, जो कि विंडोज़ पर क्लोन की गई थी, लेकिन लिनक्स पर एक्सेस की गई थी। (अब सिर्फ़िंक के साथ केवल परिवर्तन होते हैं - NTFS सिम्बलिंक DO DOK पर fuseblk mounts, लेकिन Git उन्हें संशोधित रूप में देखता है ...)
टॉमस गैंडर

जवाबों:


103

इस तरह से core.autocrlf value सेट करने का प्रयास करें:

git config --global core.autocrlf true

6
@ThorstenNiehues मैं उस सेटिंग का उपयोग कुछ कार्य परियोजना पर करता हूं। काम पर मुझे खिड़कियों का उपयोग करना चाहिए, घर मैं मैक और लिनक्स का उपयोग करना चाहिए। इससे पहले मुझे आपके समान ही समस्या थी, उसके बाद सब कुछ ठीक था।
साहा akजक

1
यह अजीब है क्योंकि लिनक्स पर विंडोज़ पर एक चेकआउट के पास \ n \ n लाइन है केवल \ n क्या आपके पास ड्रॉपबॉक्स (या समान) में दोनों कार्य-प्रतियां हैं?
थोरस्टेन नीह्यूज

1
@ThorstenNiehues नहीं, गिट रिपॉजिटरी github पर है। हम्म, शायद ड्रॉपबॉक्स किसी तरह से लाइन अंत के साथ खराब हो रहा है जब यह फ़ाइलों को सिंक करता है? यह गिट के लिए ड्रॉपबॉक्स का उपयोग करने के लिए अजीब लगता है। बिटबकेट का उपयोग करने का प्रयास करें (इसमें नि: शुल्क निजी रिपॉजिटरी हैं), बस एक छोटी रेपो बनाएं और कुछ 2 टेक्स्ट फ़ाइलों के साथ अपनी 2 मशीनों पर परीक्षण करें।
सास akजक

1
1. काम की प्रतिलिपि और स्थानीय रेपो ड्रॉपबॉक्स में है (मुझे सार्वजनिक रिपॉजिटरी की आवश्यकता नहीं है) शायद यही अंतर है
थोरस्टे नेहेस

3
Windows में: core.autocrlf trueCygWin में एक कार्य सेटिंग है। core.safecrlf falsegit bash या mingw में एक कामकाजी सेटिंग है
DrumM

43

निम्न सेटिंग के साथ, इसके बजाय .itattributes का उपयोग करें:

# Ignore all differences in line endings
*        -crlf

.itattributes को आपके वैश्विक .gitconfig के समान निर्देशिका में पाया जाएगा। यदि .ITITributes मौजूद नहीं है, तो इसे उस निर्देशिका में जोड़ें। मौजूदा। फ़ाइलों में परिवर्तन को सफलतापूर्वक लागू करने के लिए .gitattributes को जोड़ने / बदलने के बाद आपको रिपॉजिटरी का एक हार्ड रीसेट करना होगा।


इसने मेरे लिए एक स्ट्रीम में काम किया, लेकिन जब मैंने इसे उसी प्रोजेक्ट के लिए दूसरी स्ट्रीम में बनाने की कोशिश की, तब भी यह न्यूलाइन अंतर दिखाता है।
pfernandom

1
@pfernandom, क्या आप संभवतः अपनी परियोजना में कई .gitattributes हैं? यह सबसे पहले "स्थानीय" संस्करण को देखेगा, इसलिए यदि आपके पास स्थानीय निर्देशिका में एक है जहां फाइलें हैं, तो यह आपके प्रोजेक्ट पर एक का उपयोग करेगा।
ट्रैशमैन

क्या इसके पहले 8 रिक्त स्थान होने की आवश्यकता है-क्रॉलर?
इगनाटो सेप

कोई बात नहीं
ट्रैशमैन

यह केवल के लिए लाइन अंत की उपेक्षा से अधिक है git status। यह वास्तव में बदलता है कि फाइलों को रिपॉजिटरी में कैसे जांचा जाता है। रेफरी: git-scm.com/docs/gitattributes#_code_text_code
विंस

31

यह उत्तर प्रासंगिक लगता है क्योंकि ओपी बहु-ओएस समाधान की आवश्यकता का संदर्भ देता है। यह Github, लाइन एंडिंग OS को संभालने के लिए उपलब्ध लेख विवरणों की मदद करता है । क्रॉस-ओएस लाइन अंत के प्रबंधन के लिए वैश्विक और प्रति-रेपो दृष्टिकोण हैं।

वैश्विक दृष्टिकोण

लिनक्स या OS X पर हैंडलिंग Git लाइन एंडिंग कॉन्फ़िगर करें:

git config --global core.autocrlf input

विंडोज पर Git लाइन एंडिंग को कॉन्फ़िगर करें:

git config --global core.autocrlf true

प्रति-रेपो दृष्टिकोण:

अपने रेपो की जड़ में, एक .gitattributesफ़ाइल बनाएं और अपनी परियोजना फ़ाइलों के लिए लाइन समाप्त करने वाली सेटिंग्स को परिभाषित करें, निम्न प्रारूप में एक समय में एक पंक्ति: path_regex line-ending-settingsजहां निम्न में line-ending-settingsसे एक है:

  • टेक्स्ट
  • बाइनरी (वे फाइलें जिनके लिए Git को लाइन एंडिंग को संशोधित नहीं करना चाहिए - क्योंकि इससे कुछ छवि प्रकार जैसे PNGs एक ब्राउज़र में रेंडर नहीं कर सकते हैं)

textमूल्य कैसे मिलान फ़ाइलों के लिए लाइन अंत संभाल करने पर Git हिदायत करने के लिए आगे विन्यस्त किया जा सकता:

  • text - ओएस देशी लाइन के अंत में परिवर्तन लाइन अंत।
  • text eol=crlf- CRLFचेकआउट पर लाइन एंडिंग को परिवर्तित करता है ।
  • text eol=lf- LFचेकआउट पर लाइन एंडिंग को परिवर्तित करता है ।
  • text=auto - संवेदनशील डिफॉल्ट जो लाइन को Git के विवेक तक संभालता है।

यहाँ एक नमूने की सामग्री है।

# Set the default behavior for all files.
* text=auto

# Normalized and converts to 
# native line endings on checkout.
*.c text
*.h text

# Convert to CRLF line endings on checkout.
*.sln text eol=crlf

# Convert to LF line endings on checkout.
*.sh text eol=lf

# Binary files.
*.png binary
*.jpg binary

यहां लाइन एंडिंग सेटिंग बदलने के बाद अपने रेपो को रिफ्रेश कैसे करें । Tldr:

Git के साथ अपनी फ़ाइलों का बैकअप लें, अपनी रिपॉजिटरी (.git निर्देशिका को छोड़कर) में प्रत्येक फ़ाइल को हटा दें, और फिर एक ही बार में सभी फ़ाइलों को पुनर्स्थापित करें। अपनी वर्तमान फ़ाइलों को Git में सहेजें, ताकि आपका कोई भी कार्य खो न जाए।

git add . -u

git commit -m "Saving files before refreshing line endings"

इंडेक्स निकालें और वर्क डायरेक्टरी को फिर से बनाने के लिए Git को बाध्य करें।

rm .git/index

सभी नई लाइन अंत लेने के लिए Git इंडेक्स को फिर से लिखें।

git reset

फिर से लिखे, सामान्यीकृत फ़ाइलों को दिखाएं।

कुछ मामलों में, यह सब करना होगा। दूसरों को निम्नलिखित अतिरिक्त चरणों को पूरा करने की आवश्यकता हो सकती है:

git status

अपनी सभी परिवर्तित फ़ाइलों को वापस जोड़ें, और उन्हें एक कमिट के लिए तैयार करें। यह आपके लिए मौका है कि कौन सी फाइलें, यदि कोई हैं, का निरीक्षण किया जाए।

git add -u

यहां बहुत सारे संदेश देखने के लिए पूरी तरह से सुरक्षित है जो पढ़ते हैं [s] "चेतावनी: CRLF को फ़ाइल में LF द्वारा प्रतिस्थापित किया जाएगा।"

फ़ाइल को .gitattributes को फिर से लिखें।

git add .gitattributes

अपने भंडार में परिवर्तन करें।

git commit -m "Normalize all the line endings"


18

विंडोज ऑपरेटिंग सिस्टम पर git कमांड से संबंधित समस्या :

$ git add --all

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

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

संकल्प :

$ git config --global core.autocrlf false     
$ git add --all 

कोई चेतावनी संदेश नहीं आते हैं।


आपको इसका उपयोग उन सभी OS में करना चाहिए जिनका आप उपयोग कर रहे हैं, अर्थात: विंडोज़ में और लिनक्स में। प्रत्येक OS को अपने स्वयं के वैश्विक .git / config फ़ाइल को इकट्ठा करें, इसलिए आपको उन सेटिंग्स को सिगार बनाने की आवश्यकता है। यही कारण है कि @ थोरस्टेन आपको समस्याएं हो रही थीं। लेकिन मैंने झंडे को झूठ की बजाय सच में सेट कर दिया।
इमैनुएल महुनी

यह समाधान भी लिनक्स में काम करता है (@ Sašaakijak जवाब मेरे लिए काम नहीं करता है)
जूलियोसेर

4

मैंने लाइन एंडिंग में अंतरों को अनदेखा करने के लिए एक स्क्रिप्ट बनाई:

यह उन फाइलों को प्रदर्शित करेगा, जिन्हें प्रतिबद्ध सूची में नहीं जोड़ा गया है और संशोधित किया गया था (लाइन अंत में मतभेदों की अनदेखी के बाद)। आप उन फ़ाइलों को अपनी प्रतिबद्धता में जोड़ने के लिए तर्क "जोड़" सकते हैं।

#!/usr/bin/perl

# Usage: ./gitdiff.pl [add]
#    add : add modified files to git

use warnings;
use strict;

my ($auto_add) = @ARGV;
if(!defined $auto_add) {
    $auto_add = "";
}

my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
    my $diff = `git diff -b $mod 2>/dev/null`;
    if($diff) {
        print $mod."\n";
        if($auto_add eq "add") {
            `git add $mod 2>/dev/null`;
        }
    }
}

स्रोत कोड: https://github.com/lepe/scripts/blob/master/gitdiff.pl

अपडेट :

  • evandro777 द्वारा ठीक करें: जब फ़ाइल में फ़ाइल नाम या निर्देशिका में स्थान होता है

धन्यवाद! यही एकमात्र तरीका है जिससे मुझे वास्तविक अंतर मिल सकता है। बस एक समस्या है जो 3 पंक्तियों के साथ हुई है, इस त्रुटि को दिखाते हुए: sh: 1: सिंटैक्स त्रुटि:
अनधिकृत

1
स्क्रिप्ट समस्या के लिए एक फिक्स: समस्या: जब फ़ाइल में फ़ाइल नाम कहां डायरेक्टरी में जगह होती है, तो गिट "" का उपयोग करेगा, इसलिए स्क्रिप्ट टूट जाती है। इस पंक्ति को ठीक करना है: मेरे @mods = git status --porcelain 2>/dev/null | grep '^ M ' | awk '{ print \$2 }'; इसके लिए: my @mods = git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-;
evandro777

@ evandro777: धन्यवाद! मैंने उत्तर और गिट कोड दोनों को अपडेट किया है।
सेप

3

मैं दोनों विंडोज़ और लिनक्स का उपयोग करता हूं, लेकिन समाधान core.autocrlf trueने मेरी मदद नहीं की। मुझे भी कुछ नहीं बदला git checkout <filename>

इसलिए मैं विकल्प के लिए वर्कअराउंड का उपयोग करता हूं git status-gitstatus.sh

#!/bin/bash

git status | grep modified | cut -d' ' -f 4 | while read x; do
 x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
 x2="$(cat $x | md5sum | cut -d' ' -f 1 )"

 if [ "$x1" != "$x2" ]; then
    echo "$x NOT IDENTICAL"
 fi
done

मैं सिर्फ md5sumएक फाइल और उसके भाई की तुलना रिपॉजिटरी में करता हूं ।

उदाहरण आउटपुट:

$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL

2
शायद आप की जाँच करने के प्रत्येक फ़ाइल के लिए उपयोग कर सकते हैं "Git diff बी" परिवर्तन उत्कृष्टता के लिए खाली स्थान के परिवर्तन
इवान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.