Git 상태 무시 줄 끝 / 동일한 파일 / Windows 및 Linux 환경 / Dropbox / mled


112

어떻게 만드나요

자식 상태

줄 끝 차이를 무시 하시겠습니까?

배경 정보 :

프로젝트 작업을 위해 Windows와 Linux를 임의로 사용합니다. 프로젝트가 Dropbox에 있습니다.

git diff가 줄 끝을 무시하는 방법에 대해 많이 발견했습니다. 나는 meld git diff를 사용하기 때문에 각 파일에 대해 meld를 엽니 다. 그리고 meld는 "동일한 파일"이라고 말합니다.

그래서 이것을 어떻게 피할 수 있습니까? Git은 변경된 파일에 대해서만 meld를 열어야합니다. 그리고 git status는 파일 끝이 다른 경우 파일이 변경된 것으로보고하지 않아야합니다.

편집 : 원인 :

이것은 Windows에서이 설정 때문에 발생했습니다.

core.autocrlf true

그래서 Linux에서 작업 복사본을 확인하고 Windows에서 core.autocrlf를 false로 설정했습니다.

git status가 다른 새 줄을 무시하도록 만드는 방법을 아는 것이 여전히 좋습니다.


3
다른 플랫폼에서 dropbox를 사용하여 파일을 공유하는 경우 git에게 모든 파일을 바이너리로 취급하도록 명시 적으로 지시하지 않는 한 이런 일이 발생합니다. 적절한 해결책은 git 저장소에 dropbox를 사용하지 않는 것 입니다
Petesh

당신을 마음 : stackoverflow.com/questions/2825428/...를 -이 다소 도움이 될 수 있습니다
Petesh

나는 드롭 박스와 함께 좋은 작동 방법을 발견 : 설정 core.autocrlf의 거짓에 의해
토르스텐 Niehues에게

3
AFAIK는 git에게 파일을 바이너리로 처리하도록 지시하는 경우 파일을 비교하는 방식을 변경하는 부작용도 있습니다. 적절한 해결책은 git에게 줄 끝을 무시하도록 지시하는 것입니다. 내 적어도 좋아하는 것들 2 : 방식에 대해 라인 종료 문제와 불필요한 snarky의 FUD를 다루는 사람들이 : 자신의 repos를 설정
성유

와우,이 문제 core.autocrlf가 Windows의 근본 원인이지만 Linux에서도 치료법 이라는 데 시간이 걸렸습니다 . 문제는 autocrlfWindows에서 전역 적이며 리포지토리에 .git/config. 로컬을 실행하여 git config core.autocrlf trueWindows에서 복제되었지만 Linux에서 액세스 한 NTFS 작업 복사본의 잘못된 변경 사항을 제거했습니다. (지금이 심볼릭 링크 만 가짜 변경 사항은 - NTFS 심볼릭 링크가 fuseblk 마운트에 일을하지만, 힘내로 보는 수정 ...)
토마스 Gandor

답변:


103

다음과 같이 core.autocrlf 값을 설정해보십시오.

git config --global core.autocrlf true

6
@ThorstenNiehues 일부 작업 프로젝트에서 해당 설정을 사용합니다. 직장에서는 윈도우를 사용해야하고, 집에서는 맥과 리눅스를 사용해야합니다. 이 전에 나는 당신과 같은 문제가 있었고 그 설정 후에는 모든 것이 괜찮 았습니다.
Saša Šijak

1
Windows에서의 체크 아웃은 Linux에서만 \ r \ n 줄 끝이 있기 때문에 이상합니다. \ n Dropbox (또는 유사한)에 두 작업 복사본이 있습니까?
토르스텐 Niehues

1
@ThorstenNiehues 아니요, git 저장소는 github에 있습니다. 흠, Dropbox가 파일을 동기화 할 때 줄 끝이 어떻게 든 망쳐 놓을까요? git에 dropbox를 사용하는 것이 이상하게 보입니다. bitbucket (무료 개인 저장소가 있음)을 사용해보세요. 작은 저장소 하나를 만들고 작은 텍스트 파일로 2 대의 컴퓨터에서 테스트하세요.
Saša Šijak

1
1. 작업 사본 및 지역의 repo 아마 차이점이 (I 공개 저장소를 필요가 없습니다) 보관에
토르스텐 Niehues

3
Windows : core.autocrlf trueCygWin에서 작동하는 설정입니다. core.safecrlf false은 git bash 또는 mingw에서 작동하는 설정입니다.
DrumM

43

대신 .gitattributes를 다음 설정으로 사용하십시오.

# Ignore all differences in line endings
*        -crlf

.gitattributes는 글로벌 .gitconfig와 동일한 디렉토리에 있습니다. .gitattributes가 없으면 해당 디렉토리에 추가하십시오. .gitattributes를 추가 / 변경 한 후에는 기존 파일에 변경 사항을 성공적으로 적용하기 위해 저장소를 하드 리셋해야합니다.


한 스트림에서 작동했지만 동일한 프로젝트에 대해 다른 스트림에서 만들려고 시도했을 때 여전히 Newline 차이점을 보여줍니다.
pfernandom

1
@pfernandom, 프로젝트에 여러 .gitattributes가있을 수 있습니까? 가장 "로컬"버전을 먼저 확인하므로 파일이있는 로컬 디렉토리에 파일이있는 경우 프로젝트 전체에서 해당 버전을 사용합니다.
Trashman

-crlf 앞에 8 개의 공백이 있어야합니까?
Igonato

문제가되지해야
Trashman

이것은의 줄 끝을 무시하는 것 이상을 수행 git status합니다. 실제로 파일이 저장소에 체크인되는 방식을 변경합니다. ref : git-scm.com/docs/gitattributes#_code_text_code
Vince

31

이 답변은 OP가 다중 OS 솔루션에 대한 필요성을 참조하기 때문에 관련이있는 것 같습니다. 이 Github 도움말 문서에서는 OS 간 행 끝을 처리하는 사용할 수있는 접근 방식을 자세히 설명합니다. 크로스 OS 라인 엔딩을 관리하기위한 글로벌 및 리포지토리 별 접근 방식이 있습니다.

글로벌 접근

Linux 또는 OS X에서 Git 줄 끝 처리를 구성합니다.

git config --global core.autocrlf input

Windows에서 Git 줄 끝 처리를 구성합니다.

git config --global core.autocrlf true

리포지토리 별 접근 방식 :

저장소의 루트에서 .gitattributes파일을 만들고 프로젝트 파일에 대한 줄 끝 설정을 다음 형식으로 한 번에 한 줄씩 정의합니다. path_regex line-ending-settings여기서는 line-ending-settings다음 중 하나입니다.

  • 본문
  • 바이너리 (Git가 줄 끝을 수정해서는 안되는 파일-PNG와 같은 일부 이미지 유형이 브라우저에서 렌더링되지 않을 수 있기 때문)

text값이 일치하는 파일의 라인 엔딩을 처리하는 방법에 망할 놈의 지시에 더 구성 할 수 있습니다 :

  • text -줄 끝을 OS 기본 줄 끝으로 변경합니다.
  • text eol=crlf- CRLF체크 아웃시 줄 끝을 변환합니다 .
  • text eol=lf- LF체크 아웃시 줄 끝을 변환합니다 .
  • text=auto -Git의 재량에 따라 라인 핸들을 남겨 두는 합리적인 기본값.

다음은 샘플 .gitattributes 파일의 내용입니다.

# 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

여기에서 "경고 : CRLF는 파일에서 LF로 대체 될 것입니다."라는 많은 메시지를 보는 것이 안전합니다.

.gitattributes 파일을 다시 작성하십시오.

git add .gitattributes

저장소에 변경 사항을 커밋합니다.

git commit -m "Normalize all the line endings"


18

Windows 운영 체제의 git 명령과 관련된 문제 :

$ git add --all

경고 : LF는 ...에서 CRLF로 대체됩니다.

파일은 작업 디렉토리에 원래 줄 끝이 있습니다.

해상도 :

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

경고 메시지가 나타나지 않습니다.


사용중인 모든 OS, 즉 Windows 및 Linux에서이 작업을 수행해야합니다. 각 OS에는 자체 전역 .git / config 파일이 있으므로 이러한 설정을 유사하게 만들어야합니다. 이것이 @Thorsten이 문제가 있었던 이유입니다. 하지만 플래그를 거짓 대신 참으로 설정했습니다.
Emmanuel Mahuni

이 솔루션은 리눅스합니다 (@ SašaŠijak 응답하지 나를 위해 작동 않았다)도 작동
줄리우 세자르 소아리스 이스핀 돌라

4

줄 끝의 차이점을 무시하는 스크립트를 만들었습니다.

커밋 목록에 추가되지 않고 수정 된 파일을 표시합니다 (줄 끝의 차이를 무시한 후). "add"인수를 추가하여 해당 파일을 커밋에 추가 할 수 있습니다.

#!/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 : 구문 오류 : 종결되지 않은 따옴표 문자열
evandro777

1
스크립트 문제 수정 : 문제 : 파일 이름 ou 디렉토리에 공간이 있으면 git은 ""를 사용하므로 스크립트가 중단됩니다. 수정 사항은 다음 줄을 변경하는 것입니다. my @mods = git status --porcelain 2>/dev/null | grep '^ M ' | awk '{ print \$2 }'; 이것에 : 내 @mods = git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-;
evandro777

@ evandro777 : 감사합니다! 나는 대답과 자식 코드를 모두 업데이트했습니다.
lepe

3

Windows와 Linux를 모두 사용하지만 솔루션 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
변경 공백 변경 Excel 용 아마 당신은 확인하기 위해 각 파일에 대해 "자식은 diff -b"를 사용할 수 있습니다
이반을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.