창에서 git이 CR + LF 대신 LF를 사용하도록하려면 어떻게합니까?


335

git이 Windows를 사용 LF하지 않고 파일을 체크 아웃하도록 강제하고 싶습니다 CR+LF. 두 가지 구성 옵션을 확인했지만 올바른 설정 조합을 찾을 수 없었습니다.

모든 파일을 변환하고 파일을 LF유지하고 싶습니다 LF.

비고 : 내가 사용 autocrlf = input했지만 파일을 커밋 할 때 파일을 복구합니다. 사용하도록 강요하고 싶습니다 LF.

아마 나는 그렇게 분명하지 않다 : 저장소가 이미 사용하고 LF있지만 파일은 msysgit을 사용하여 체크 아웃 CR+LF내가 그들을 얻을 수 msysgit을 강제 할 LF: 유닉스 라인 엔딩을 강제 .

>git config --list | grep crlf
core.autocrlf=input

2
autocrlf=input올바른 옵션입니다. 물론 그것은 cr+lf저장소에 실제로 있거나 파일 cr+lf을 git에 추가하기 전에 다른 도구로 파일을 생성하는 파일 로부터 보호하지 않습니다 . 이것이 효과가없는 어떤 문제가 있습니까?
CB Bailey

2
저장소의 파일은 이미 사용 LF중이지만 Windows에서 파일을 받으면 msysgit이로 변환합니다 CR+LF.
sorin

설정에 문제가 있어야합니다. 방금 msysgit 설치에서 이것을 테스트했습니다. 로 autocrlf설정하면 inputgit은 lf줄 바꿈 만 남겨 둡니다. 의 출력을 게시 할 수 있습니까 git config?
CB Bailey

1
이 경우 버그를 기록하는 것이 좋습니다. 가급적 문제가있는 테스트 저장소를 가리키고보고있는 동작이 확실히 잘못 되었기 때문에 재현 단계를 포함하는 것이 좋습니다 (그러나 재현 할 수는 없습니다).
CB Bailey

1
작은 팁은 당신이 생각하는 'git'에서 git 명령을 실행하고 있는지 확인하는 것입니다. 예를 들어 Windows에 git을 설치하고 cygwin에 git을 설치했을 수 있으므로 올바른 git config를 설정했는지 확인하십시오.
lfred

답변:


106

그의 질문에 OP가 추가되었습니다.

msysgit을 사용하여 체크 아웃 한 파일을 사용 CR+LF하고 있으며 msysgit이LF

첫 번째 간단한 단계는 여전히 .gitattributes파일에 있습니다.

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(같은 코멘트에 주목 하여 손자 를 참조하여, .gitattributes최종의 온라인 변환 어떤 피하기 위해) CRLF올바른 인 파일을 변환 eol.

그리고 항상 모든 버전의 파일에 git config --global core.autocrlf false적용되는 변환을 비활성화하는 것이 좋습니다.

크로스 플랫폼 git 구성에 대한 모범 사례를 참조하십시오 .

Git 2.16 (2018 년 1 분기) 이후로git add --renormalize . 해당 .gitattributes설정을 즉시 적용 할 수 있습니다 .


그러나 두 번째로 강력한 단계는 gitattribute 필터 드라이버를 포함 하고 얼룩 단계를 추가합니다.

필터 드라이버

작업 트리를 업데이트 할 때마다 스크립트는에서 지정한 파일에 대해서만 .gitattributes강제 LF eol및 다른 형식 옵션을 적용 할 수 있습니다.
" clear"스크립트가 아무 작업도 수행하지 않으면 파일을 변환 한 후 (커밋 한 후에) 따라야하는 형식을 정확하게 적용하게됩니다.


한 가지 질문 : * .txt는 확장명이 .txt 인 모든 파일 또는 모든 텍스트 파일 (2 진이 아님)을 나타냅니다. 프로젝트에 포함 된 모든 종류의 파일 확장자를 가진 목록을 만들 수 없습니다.
sorin

1
@Sorin : .txt확장명을 가진 모든 파일 . *로 일반화하기 전에 먼저이를 설정하고 특정 그룹에서 테스트하고 음수 규칙 !*.xyz ...을 추가하여 해당 규칙에서 일부 파일을 제외시키는 것이 좋습니다.
VonC

1
지금 쯤 .gitattributes라인 읽어야 *.txt text eol=lf에 따라 git-scm.com/docs/gitattributes
손자

@grandchild 감사합니다. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함 시켰습니다.
VonC

추가 한 후에 .gitattributes해야 할 것 같습니다git add --renormalize .
shuva

461

Windows에서 LF 엔딩을 얻는 올바른 방법은 먼저 다음 core.autocrlffalse같이 설정 하는 것입니다 .

git config --global core.autocrlf false

msysgit을 사용하는 경우 true시스템 설정에서 설정하기 때문에이 작업을 수행해야합니다 .

이제 git은 줄 끝 정규화를 수행하지 않습니다. 당신이 파일을 원하는 경우에 당신이 정상화 될 체크인이 수행 세트 text=auto에서 .gitattributes모든 파일에 대해 :

* text=auto

그리고 다음 core.eol으로 설정 하십시오 lf.

git config --global core.eol lf

이제 다음을 실행하여 단일 저장소를 crlf (작업 디렉토리에서!)로 전환 할 수도 있습니다.

git config core.eol crlf

구성을 완료 한 후 git에서 repo의 모든 파일을 정규화 할 수 있습니다 . 이렇게하려면 리포지토리의 루트로 이동하여 다음 명령을 실행하십시오.

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

이제 git이 작업 디렉토리 의 파일을 정규화하려면 다음 명령을 실행 하십시오 .

git ls-files -z | xargs -0 rm
git checkout .

3
치명적인 pathspec을 받고 있어요 ''직후 파일과 일치하지 않습니다git diff --cached --name-only -z | xargs -0 git add
CMCDragonkai

3
출력은 git diff --cached --name-only무엇입니까?
Chronial

1
예를 들어, 해당 리포지토리 복제하는 동안 이 구성 설정할 수 있습니다 git clone --config core.autocrlf=false <repo path>.
Chris Long

240

나는이 대답에 상당히 자주 돌아 왔지만 이것들 중 어느 것도 나에게 맞는 것은 아닙니다. 즉, 나에게 맞는 대답은 다른 사람들의 혼합입니다.

내가 찾은 것은 다음과 같습니다.

 git config --global core.eol lf
 git config --global core.autocrlf input

이러한 전역 설정이 설정 한 후 체크 아웃 된 REPOS를 들어, 모든은 (는) REPO에 무엇으로 체크 아웃 할 것이다 - 희망 LF( \n). 체크인시 모든 CRLF것이 변환됩니다 LF.

이미 체크 아웃 한 기존 리포지토리 (리포지토리에는 줄 끝이 있지만 작업 복사본은 없음)를 사용하여 다음 명령을 실행하여 문제를 해결할 수 있습니다.

git rm -rf --cached .
git reset --hard HEAD

이렇게하면 프롬프트 rm( r)없이 현재 디렉토리 ( ) 에서 -f편집 한 파일 ( )을 제외한 모든 파일이 재귀 적으로 ( ) 삭제됩니다 . 그런 다음 모든 파일을 실제 줄 끝이있는 상태 (리포지토리의 내용과 일치)로 되돌립니다.--cached.reset

리포지토리에서 파일의 줄 끝을 수정 해야하는 경우 IntelliJ 또는 Sublime Text와 같이 대량으로 작업을 수행 할 수있는 편집기를 가져 오는 것이 좋지만 좋은 사람이이를 지원할 것이라고 확신합니다.


1
다른 줄 끝 처리가 필요한 하위 디렉토리가있는 단일 저장소가 있습니다. 따라서 전역 옵션을 설정하면 작동하지 않습니다. 단일 레포에서도 마찬가지입니다. .gitattributes에서 이와 동일한 설정을 어떻게 적용합니까?
RobG

Notepad++오른쪽 하단에 현재 열린 파일의 줄 끝이 표시됩니다. 해당 필드를 마우스 오른쪽 버튼으로 클릭하면 줄 끝을 변경할 수 있습니다.
winklerrr

1
core.autocrlf input옵션은 core.eol설정을 무시 하므로 둘 다 설정하는 것이 중복됩니다. ( git-scm.com/docs/git-config 참조 )
Andrew Marshall

1
당신의 도움으로 보푸라기와 리눅스를 정복했습니다. 이제 파일을 체크인 할 수 있습니다.
GC_

57

문맥

만약 너라면

  1. 모든 사용자가 텍스트 파일에 대해 LF 줄 끝을 갖도록하고
  2. 모든 사용자가 git 구성을 변경하도록 할 수는 없습니다.

git 2.10부터 시작할 수 있습니다. 2.10 이상이 필요합니다. 2.10은 eol = lf와 함께 text = auto 동작을 수정 했기 때문 입니다. 소스 .

해결책

.gitattributes다음 내용을 가진 git 저장소의 루트에 파일을 넣으십시오 .

* text=auto eol=lf

커밋하십시오.

선택적 조정

또한 .editorconfig최신 툴링으로 원하는 줄 끝으로 새 파일을 만들도록 저장소 루트에를 추가 할 수 있습니다 .

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

3
이것은 나에게 가장 좋은 해결책이었습니다. Intellij로 작성할 때 LF EOL을 작성할 수 있도록 이것을 editorconfig.org 와 결합했습니다 .
재즈 피

이것이 지금까지 가장 좋은 솔루션입니다. 구성 명령을 수동으로 실행할 필요가 없습니다!
Cameron Tacklind

26

core.autocrlf=input원하는 설정에 적합하지만 변경 사항을 적용하려면 a git update-index --refresh및 / 또는 a 를 수행해야 할 수도 있습니다 git reset --hard.

core.autocrlf설정하면 inputgit은 체크 아웃시 줄 바꿈 변환을 적용하지 않습니다 (따라서 리포지토리에 LF가 있으면 LF가 표시됩니다). 어떻게 든 복사하면 그들은 리포로 들어 가지 않을 것입니다.


19
명령은 git rm --cached -r이어야합니다. && git reset --hard
koppor

0

이 문제에 대한 해결책은 https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings 에서 찾을 수 있습니다.

Windows에서이 문제를 해결하는 방법에 대한 간단한 설명 :

줄 끝에 대한 전역 설정 git config core.autocrlf 명령은 Git에서 줄 끝을 처리하는 방법을 변경하는 데 사용됩니다. 단일 인수가 필요합니다.

Windows에서는 구성에 true를 전달하기 만하면됩니다. 예를 들면 다음과 같습니다. C :> git config --global core.autocrlf true

행운을 빌어 요

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.