git EOL 변환 비활성화


100

나는 어떤 작업에 대해서도 줄 끝을 변경하지 않도록 자식을 얻으려고합니다. 불행히도, 그것은 중요하지 않은 것 같습니다. 이 동작을 비활성화하기위한 다양한 메커니즘이있는 다음 테스트 케이스로 축소했습니다.


  • 두 대의 컴퓨터로 시작 (Windows 컴퓨터 = A, Linux 컴퓨터 = B)
  • 두 컴퓨터에서 : 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"예를 들어 this .
    • git branch master_recv
    • 리모컨 추가
  • document.txtCRLF를 포함하는 저장소에 새 파일 만들기
  • 커밋 : git add -A, 다음git commit -m "<something>"
  • A document.txt에는 여전히 CRLF가 포함되어 있습니다 (그리고이를 삭제하고로 재설정 --hard하면 CRLF가있는 버전 이 반환 됨).

  • 전체 디렉터리를 컴퓨터 B로 SCP
  • 새 파일 추가 new fileCRLF가 포함
  • 커밋 : git add -A, 다음git commit -m "<something>"
  • B document.txt와 B new file모두 여전히 CRLF를 포함합니다.

  • B의 마스터를 A로 끌어옵니다. git pull <remote> master:master_recv
  • A document.txt가 LF로 변경되었습니다. 추가 된 파일 new file에는 LF도 포함되어 있습니다.

B가 Windows 시스템이면 문제가 발생하지 않습니다.


했습니다 core.autocrlf 항상 거짓이었다? \n이미 저장소에 줄 끝이있는 것 같 습니까? 작업 디렉토리에서 저장소에서 변경할 설정 이 없습니다 . \n\r\n
Edward Thomson

항상 설정되지는 않았습니다 (예 : 리포지토리가 원래 생성되었을 때). 그러나 저장소에 이미 CR 줄 끝이 없어야합니다. 또한, 나는 어떤 변화도 일어나지 않기를 바랍니다 .
imallett 2014

설정 줄 끝을 CRLF로 유지 해야 하기 때문에 묻습니다 . 당신은 당신의 저장소에 일부 파일을 게시 할 수 단지 내 (일반적으로 인정 하듯이 아마 성가신) 교화를위한 그것의 개체 ID를?
Edward Thomson

@EdwardThomson이 무슨 뜻이야? 저장소는 공개되지 않습니다 (Linux 머신이 아니기 때문에). 예제 파일이 필요하다고 가정하겠습니다. 편집을 참조하십시오.
imallett

네, 파일에 CRLF 줄 끝이 있음에 동의합니다. 한 가지를 명확히 할 수 있습니까? "윈도우 머신의 줄 바꿈이 CR로 변경됩니다!" 확실히 그것은 오타였습니까, 아니면 정말로 Mac OS 9 스타일 캐리지 리턴 라인 엔딩을 얻고 있습니까?
Edward Thomson

답변:


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 구성에 따라 줄 끝이 설정됩니다. git 구성을 변경하려면 다음을 수행하십시오.

이 디렉토리의 구성 파일로 이동하십시오.

1) C : \ ProgramData \ Git \ config

2) Notepad ++ (또는 원하는 텍스트 편집기)에서 구성 파일을 엽니 다.

3) "autocrlf ="를 false로 변경하십시오.

여기에 이미지 설명 입력


31
코드 태그 대신 그림을 사용하는 이유는 무엇입니까? 매우 불편 함
Clint

31
사진에 큰 빨간색 상자를 추가하여 항목을 강조 할 수 있기 때문입니다.
Gene

21
를 사용하면 * text=false텍스트가 설정 해제되지 않습니다. 문자열 값이 false로 설정된 상태로 둡니다. 이것은 텍스트를 지정하지 않은 상태로 두는 것과 같은 효과가 있습니다 (특별히 설정되지 않음). 사용 * -text하면 특수 설정되지 않은 설정이 제공됩니다. 경로에서 텍스트 속성을 설정 해제하면 체크인 또는 체크 아웃시 줄 끝 변환을 시도하지 않도록 git에 알립니다.
JustAMartin

이 답변에 대해 @Gene에게 감사드립니다. 이것은 하루 종일 나를 미치게 만들었고 이것은 나를 위해 그것을 해결했습니다!
LeopardSkinPillBoxHat

7
이 답변에 감사드립니다. 누군가가 잘못된 조언을 따랐다는 것을 알아 내기 위해 반나절의 비용이 들었습니다. @ JustAMartin이 지적했듯이 * text=false효과가 없습니다. 답을 고쳐주세요!
Paul B.

47

한 가지 간단한 해결책은 다음과 같습니다.

  • 모든 저장소에 대해 core.autocrlf가 false로 설정되어 있는지 확인하십시오 .
    git config --global core.autocrlf false
  • 저장소를 다시 복제하고 EOL 변환이 수행되지 않았는지 확인하십시오.
  • 또는 Git 2.16 (Q1 2018) 이후 현재 저장소를 유지하고git add --renormalize .

자동으로 수행되는 변환 이 있으면 리포지토리 내에 .gitattributes core.eol지시문 이 있음 을 의미합니다 .

함께 힘내 2.8 이상 (2016 월) 여전히와 EOL 변환이 있는지 확인 :

git ls-files --eol

2
autocrlf오늘은 사용하지 마십시오 ! unsetted autocrlffalse. 당신은 망할 놈의 트렌디 한 운동 뒤쳐
게으른 오소리

1
위와 같이 (글로벌 플래그는 아니지만) 이것을 시도했지만 작동하지 않았습니다. git 버전은 1.8.5.2.
imallett

@IanMallett "이 시점에서 Linux 시스템에는 여전히 CRLF가있는 것 같습니다.": 콘텐츠를 다시 정규화하거나 복제 할 때까지 (Windows에서와 같이)
VonC

11

나는 그것을 알아. SCP 프로그램이 줄 끝을 변환하는 것 같습니다. 의도적으로 LF 엔딩으로 파일을 만들고 다운로드 할 때 CRLF로 나타나는 것을 관찰했을 때 이것을 발견했습니다.

이것이 나에게 해결책 이었기 때문에 나는이 대답을 받아들이고 있지만 미래의 사람들은 더 일반적인 해결책을 위해 다른 대답을 참조해야합니다.


1
내 대답보다 더 구체적입니다. +1
VonC 2014

4

에서 gitattributes (5) 매뉴얼 페이지 "효과"항목

text

이 속성은 라인 끝 정규화를 활성화하고 제어합니다. 텍스트 파일이 정규화되면 해당 줄 끝이 저장소에서 LF로 변환됩니다. 작업 디렉토리에서 사용되는 줄 끝 스타일을 제어하려면 eol단일 파일 의 속성과 core.eol 모든 텍스트 파일 의 구성 변수를 사용하십시오.

Set

경로에 텍스트 속성을 설정하면 줄 끝 정규화가 활성화되고 경로가 텍스트 파일로 표시됩니다. 콘텐츠 유형을 추측하지 않고 줄 끝 변환이 발생합니다.

Unset 경로에서 text 속성을 설정 해제하면 체크인 또는 체크 아웃시 라인 끝 변환을 시도하지 않도록 Git에 지시합니다.

core.autocrlf새로운 (1.7.2+) Git에서 사용되지 않았 core.eol으며 더 안정적인 방법으로 간주되는 text-attribute의 올바른 설정 | 해제


에서 .gitattributes파일, 그래도 난 바로 텍스트로 명시 적으로 비활성화 모든 것을했다? 또한 변환하지 않는 옵션 crlf이 표시되지 않습니다 (효과가 없을 수도 있음)?
imallett

6
자주 혼동되는 중요한 사항-설정을 해제 text하고 변환을 방지하려면 .gitattributes * -text* text=false. false은 (는) text속성에 유효한 값이 아닙니다. git은이를 인식하지 못하고 대신 기본 autocrlf 설정으로 돌아갑니다. 또한 text값을 변경 한 후에 는 로컬 리포지토리에서 모든 파일을 백업하고 커밋을 수행 한 다음 필요에 따라 올바른 줄 끝으로 파일을 복원하고 다시 커밋해야합니다. 그러면 줄 끝이 git에 의해 다시 수정되지 않습니다.
JustAMartin 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.