git EOL 변환 비활성화 = B) 두 컴퓨터에서 : git config

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


  • 두 대의 컴퓨터로 시작 (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 시스템이면 문제가 발생하지 않습니다.



답변

프로젝트 안에 .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로 변경하십시오.


답변

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

  • 모든 저장소에 대해 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

답변

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

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


답변

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

text

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

Set

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

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

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