줄 끝 변환이 깃 코어에서 작동하는 방식입니다.서로 다른 운영 체제 간의 자동 제어
Stack Overflow에 대한 다양한 질문과 답변은 물론 핵심에 대한 설명서도 많이 읽었습니다.autocolf 설정이 작동합니다.
제가 읽은 바로는 다음과 같습니다.
Unix 및 Mac OSX(OSX 이전 버전에서는 CR 사용) 클라이언트는 LF 줄 끝단을 사용합니다.
Windows 클라이언트는 CRLF 줄바꿈을 사용합니다.
코어일 때.autocolf는 클라이언트에서 true로 설정되며, git 저장소는 항상 LF 줄 끝 형식으로 파일을 저장하고 클라이언트의 파일에 있는 줄 끝은 체크아웃/커밋 시 앞뒤로 변환됩니다(즉, Windows).클라이언트에 있는 줄 끝 파일의 형식에 관계없이(이것은 Tim Clem의 정의와 맞지 않음 - 아래 업데이트 참조).
다음은 코어의 '입력' 및 '거짓' 설정에 대해 동일하게 문서화하려는 행렬입니다.줄 끝 변환 동작이 확실하지 않은 물음표가 있는 autocolf.
제 질문은 다음과 같습니다.
- 물음표는 무엇이어야 합니까?
- 이 행렬이 "질문이 아닌 표시"에 대한 것입니까?
공감대가 형성되는 것으로 보이므로 답변에서 물음표를 업데이트하겠습니다.
핵의오토로프 값참 입력 거짓----------------------------------------------------------커밋 | 변환 ?new | to LF (LF로 변환?) (변환 없음?) 로 전환시키다 | 아니요기존 | LF(LF로 변환?) 변환 체크아웃 | 변환? 아니요기존 | CRLF(변환 없음?) 변환
저는 정말로 다양한 설정의 장단점에 대한 의견을 찾고 있는 것이 아닙니다.저는 단지 세 가지 설정에서 각각 GIT가 작동할 것으로 예상하는 방법을 명확하게 하는 데이터를 찾고 있습니다.
--
업데이트 04/17/2012: JJD가 링크한 Tim Clem의 글을 댓글로 읽은 후 위 표의 "unknown" 값 중 일부 값을 수정하고 "checkout existing | true to convert to client"를 변경했습니다.그가 제시한 정의는 다음과 같습니다. 다른 곳에서 본 것보다 더 명확합니다.
core.autoclf = false
기본값이지만 대부분의 사용자는 즉시 변경할 것을 권장합니다.false를 사용한 결과 Git는 파일의 줄 끝 부분을 방해하지 않습니다.LF, CRLF, CR 또는 이 세 가지를 임의로 혼합하여 파일을 체크인할 수 있으며 Git는 상관하지 않습니다.이로 인해 diff를 읽기가 더 어려워지고 병합이 더 어려워질 수 있습니다.Unix/Linux 환경에서 작업하는 대부분의 사용자는 CRLF 문제가 없고 개체 데이터베이스에 파일을 쓰거나 작업 디렉터리에 쓸 때마다 Git가 추가 작업을 수행할 필요가 없기 때문에 이 값을 사용합니다.
core.autoclf = true
이는 Git가 모든 텍스트 파일을 처리하고 객체 데이터베이스에 파일을 쓸 때 CRLF가 LF로 대체되는지 확인하고 작업 디렉토리에 쓸 때 모든 LF를 CRLF로 다시 변환한다는 것을 의미합니다.이 설정은 CRLF를 작업 디렉토리에 유지하면서 다른 플랫폼에서 리포지토리를 사용할 수 있도록 보장하기 때문에 Windows에서 권장되는 설정입니다.
core.autoclf = 입력
이는 Git가 모든 텍스트 파일을 처리하고 해당 파일을 개체 데이터베이스에 쓸 때 CRLF가 LF로 대체되는지 확인한다는 것을 의미합니다.그러나 그 반대는 되지 않을 것입니다.개체 데이터베이스에서 파일을 다시 읽어 작업 디렉터리에 기록할 때 줄의 끝을 나타내는 LF가 계속 표시됩니다.이 설정은 일반적으로 CRLF가 저장소에 기록되는 것을 방지하기 위해 유닉스/리눅스/OSX에서 사용됩니다.웹 브라우저에서 코드를 붙여넣고 실수로 CRLF를 파일 중 하나에 넣으면 개체 데이터베이스에 쓸 때 해당 CRLF가 LF로 교체되도록 한다는 아이디어입니다.
Tim의 기사는 훌륭합니다. 제가 유일하게 생각할 수 없는 것은 저장소가 LF 형식이라고 가정한다는 것입니다. 특히 Windows 전용 프로젝트의 경우에는 그렇지 않습니다.
팀의 기사를 jmlane이 현재까지 가장 많이 투표한 답변과 비교하면 참 및 입력 설정에 대한 완벽한 동의와 거짓 설정에 대한 불일치를 보여줍니다.
의 방법에 대한 의 설명core.autocrlfgit 속성 관리 페이지의 속성 섹션에서 작업을 찾을 수 있습니다.
이 이런식로의 방법입니다.core.autocrlf현재(또는 적어도 v1.7.2 이후) 작동하는 것으로 보입니다.
core.autocrlf = true
- 중 " " "만 있는 텍스트 파일
LF가 문가표화됨으로 됩니다.CRLF, 에 작업트포가 되어 있습니다.CRLF것은 . - 만 있는
LF는 소의문다정서규됩니다화음에저자장는ized다▁from▁charact▁normalers에서 정규화됩니다.CRLFLF저장소에 다시 커밋할 때.가 된 파일CRLF변경되지 않은 상태로 저장소에 커밋됩니다.
core.autocrlf = input
- 리포지토리에서 체크아웃된 텍스트 파일은 원본 EOL 문자를 작업 트리에 유지합니다.
- 에 다음과 같이 " " " "이 포함되어 .
CRLF가 문가표화됨으로 됩니다.LF저장소에 다시 커밋할 때.
core.autocrlf = false
core.eol작업 트리의 텍스트 파일에 있는 EOL 문자를 나타냅니다.core.eol = native기본적으로 Git가 실행 중인 위치에 따라 작업 트리 EOL이 달라집니다.CRLF시스템 윈우즈서또는에서LF*nix(없음)- 저
gitattributes커밋의 은 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "LF문자).
저는 최근에 이 문제를 조사했고 또한 상황이 매우 복잡하다는 것을 알게 되었습니다. 그core.eol설정은 확실히 EOL 문자가 깃에 의해 처리되는 방식을 명확히 하는 데 도움이 되었습니다.
혼합 플랫폼 프로젝트의 EOLs 문제는 오랫동안 제 삶을 비참하게 만들었습니다.이 문제는 일반적으로 저장소에 이미 서로 다른 EOL과 혼합된 EOL을 가진 파일이 있을 때 발생합니다.이는 다음을 의미합니다.
- 보고서에 EOL이 서로 다른 파일이 있을 수 있습니다.
- EOL이 수 를 들어, " 레의일파혼다합있있수을습니포"의 조합이 있습니다. 예를 들어 다음과 같은 조합이 있습니다.
CRLF그리고.LF같은 줄에
이것이 어떻게 발생하는지는 여기서 문제가 아니라 실제로 발생합니다.
Windows에서 다양한 모드와 그 조합에 대해 몇 가지 변환 테스트를 실행했습니다.
다음은 약간 수정된 표입니다.
결과 변환 시 | 결과 변환 시다양한 | repo에서 체크아웃한 다양한 파일을 커밋합니다.repo 및 | 혼합 파일이 포함된 eOLs into repo 및 |핵의autoclf 값: | core.autoclf 값:--------------------------------------------------------------------------------파일 | true | 입력 | false | tr | true | input | false--------------------------------------------------------------------------------Windows-CRLF | CRLF -> LF | CRLF -> LF | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로Unix - LF | 있는 그대로 | 있는 그대로 | 있는 그대로 | LF -> CRLF | 있는 그대로 | 있는 그대로Mac - CR | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로혼합-CRLF+LF | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로혼합-CRLF+LF+CR | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로 | 있는 그대로
보시다시피 커밋 시 변환이 발생하는 경우는 2개(왼쪽 열 3개)입니다.나머지 경우 파일은 그대로 커밋됩니다.
체크아웃 시(오른쪽 열 3개) 변환이 발생하는 경우는 다음과 같습니다.
core.autocrlf이라true그리고.- 은 의파일다같습다니음과은레가 있습니다.
LFEOL.
저에게 가장 놀라운 것은 많은 EOL 문제의 원인은 혼합 EOL이 다음과 같은 구성이 없다는 것입니다.CRLF+LF정상화되다
또오 "래된한" 의 "도 참고하십시오CR변환되지 않을 뿐만 아니라.
이것은 잘못 작성된 EOL 변환 스크립트가 다음과 같은 혼합 종료 파일을 변환하려고 할 경우CRLFLF으로써, 변만으로환.LFCRLF을 " "mix", "mix"와 혼합 모드로 둡니다.CRCRLF 변환되었습니다.CRCRLF.
그러면 Git는 아무것도 변환하지 않을 것입니다.true모드, 그리고 EOL 대혼란이 계속됩니다.일부 편집자와 컴파일러(예: VS2010)가 Mac EOL을 좋아하지 않기 때문에 실제로 이러한 문제가 발생하여 파일이 엉망이 되었습니다.
이러한 문제를 진정으로 처리할 수 있는 유일한 방법은 때때로 모든 파일을 체크아웃하여 전체 레포를 정상화하는 것입니다.input또는false적절한 정규화를 실행하고 변경된 파일(있는 경우)을 다시 커밋합니다.에서 작업을 시작합니다.core.autocrlf true.
그core.autocrlf체제에 .
은 그나기 은값본입니다.trueWindows(윈도우).리눅스에서 그것은input.
체크아웃 및 커밋 사례에 대해 세 가지 가능한 값을 조사했습니다.
다음은 결과 표입니다.
╔═══════════════╦══════════════╦══════════════╦══════════════╗
║ core.autocrlf ║ false ║ input ║ true ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║ ║ LF => LF ║ LF => LF ║ LF => CRLF ║
║ git checkout ║ CR => CR ║ CR => CR ║ CR => CR ║
║ ║ CRLF => CRLF ║ CRLF => CRLF ║ CRLF => CRLF ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║ ║ LF => LF ║ LF => LF ║ LF => LF ║
║ git commit ║ CR => CR ║ CR => CR ║ CR => CR ║
║ ║ CRLF => CRLF ║ CRLF => LF ║ CRLF => LF ║
╚═══════════════╩══════════════╩══════════════╩══════════════╝
곧 출시될 Git 1.7.2와 함께 "eol 변환" 전선의 상황이 바뀔 예정입니다.
새 구성 설정이 추가/진화되고 있습니다.
은 '를 하는 것입니다.
core.eolvariable' 현재 있 config variable'에 .pu(내 시리즈의 마지막).
"라고 암시하는 대신에.core.autocrlf=true대체항목니다입의다니의▁"ment▁for"의 대체어입니다.* text=auto텍스트 파일 정규화가 없는 리포지토리의 작업 디렉터리에서 CRLF로 작업하려는 사용자에게만 해당된다는 사실을 명시합니다.
활성화된 경우 "core.eol"은 무시됩니다.변수인" 새구 를변수 "를 합니다.
core.eol사용자가 작업 디렉토리에서 줄 바꿈 표준화된 파일에 사용할 줄 끝단을 설정할 수 있습니다.
본값은 " 니다입기"입니다.native, 를, 모든 에서는 LF를 합니다.즉, Windows에서는 CRLF를, LF는 LF를 의미합니다.고참:"core.autocrlfcore.eol.
이는 다음을 의미합니다.[core] autocrlf = true는 CRLF 파일이 CRLF 파일에 에 저장합니다.
core.eol"" 정설됨로됨"로lf".core.eol:줄합니다. 파일 이 " " " " 인 파일의 " " " 인 줄 끝 유형을 설정합니다.
text재산의 집합
대안으로는 플랫폼의 네이티브 라인 끝을 사용하는 'lf', 'crlf' 및 'native'가 있습니다.
은 기값은 입다니입니다.native.
다른 진화가 고려되고 있습니다.
1.8을 위해서, 저는 만드는 것을 고려할 것입니다.
core.autocrlf정규화를 켜고 작업 디렉토리 줄 종료 결정을 core.eol로 남겨두지만, 그러면 사용자 설정이 중단됩니다.
23월) 은 git 2.8 (2016년 3월) 을 하였습니다.core.autocrlf에올에 영향을 줍니다.
커밋 817a0c7(2016년 2월 23일), 커밋 6e336a5, 커밋 df747b8(2016년 2월 10일), 커밋 df747b8(2016년 2월 10일), 커밋 4b4024f, 커밋 bb211b4, 커밋 92c39c, 커밋 4b4024f, 커밋 bb4, 커밋 bb211b4, 커밋 320commit bb13(tboegi2016년 2월 5일)을 참조.
(주니오 C 하마노에 의해 합병 -- -- commit c6b94eb, 2016년 2월 26일)
convert.c리터팩터.crlf_action다음의 결정 및 사용 방법을 리팩터합니다.
crlf_action.
오늘, 안될때"가 없는 입니다.crlf되어 있습니다. 파어있설습다니에 설정됩니다.crlf_action으로 설정됨CRLF_GUESS.사용하다CRLF_UNDEFINED대신, "를 검색합니다.text또는 "eol종전과 같이의 기존제교를 합니다.
CRLF_GUESS예:예외:
CRLF_GUESS && core.autocrlf=true -> CRLF_AUTO_CRLF
CRLF_GUESS && core.autocrlf=false -> CRLF_BINARY
CRLF_GUESS && core.autocrlf=input -> CRLF_AUTO_INPUT
다음을 정의하여 무엇이 무엇인지 더 명확히 설명합니다.
- CRLF_UNDEFINED : No attributes set. Temparally used, until core.autocrlf
and core.eol is evaluated and one of CRLF_BINARY,
CRLF_AUTO_INPUT or CRLF_AUTO_CRLF is selected
- CRLF_BINARY : No processing of line endings.
- CRLF_TEXT : attribute "text" is set, line endings are processed.
- CRLF_TEXT_INPUT: attribute "input" or "eol=lf" is set. This implies text.
- CRLF_TEXT_CRLF : attribute "eol=crlf" is set. This implies text.
- CRLF_AUTO : attribute "auto" is set.
- CRLF_AUTO_INPUT: core.autocrlf=input (no attributes)
- CRLF_AUTO_CRLF : core.autocrlf=true (no attributes)
번역(환든든ol모▁e변)(환ion▁fromol역번▁all▁e이)에서 EOL 변환)
eol=또는autocrlf및 설정"clean필터)는 파일이 작업 트리에서 인덱스로 이동할 때 실행됩니다.git add에 있다기보다는git commit시간을.
:git commit -a또는--only또는--include그러나 이때 인덱스에 파일을 추가합니다.)
자세한 내용은 "autocolf와 eol의 차이점"을 참조하십시오.
누군가에게 도움이 될 경우를 대비해 지금까지 제가 이해한 내용입니다.
core.autocrlf=true그리고.core.safecrlf = true
모든 줄 끝이 동일하지만 서로 다른 플랫폼에서 작업하는 리포지토리가 있습니다.Git는 행 끝이 플랫폼의 기본값으로 변환되도록 합니다.이것이 왜 중요합니까?새 파일을 만든다고 가정해 보겠습니다.플랫폼의 텍스트 편집기는 기본 줄 끝을 사용합니다.당신이 그것을 체크인할 때, 만약 당신이 코어가 없다면.autocolf가 true로 설정되어 있습니다. 기본적으로 다른 줄 끝으로 끝나는 플랫폼의 사용자에 대해 줄 끝 불일치가 발생했습니다.crlf 연산이 가역적인지 알고 싶어서 항상 safecrlf를 설정합니다.이 두 가지 설정을 사용하여 Git는 파일을 수정하지만 수정 내용이 되돌릴 수 있는지 확인합니다.
core.autocrlf=false
이미 여러 줄의 끝이 체크인된 리포지토리가 있는데 잘못된 줄의 끝을 수정하면 다른 문제가 발생할 수 있습니다.이 경우 git에게 줄 끝을 변환하라고 말하지 않는 것이 가장 좋습니다. 그러면 git이 해결하도록 설계된 문제가 악화되어 읽기 쉽고 병합이 덜 고통스러울 수 있습니다.이 설정을 사용하면 Git가 파일을 수정하지 않습니다.
core.autocrlf=input
이는 기본적으로 LF 줄 끝이 있는 플랫폼에서 CRLF 줄 끝이 있는 파일을 생성한 사용 사례를 다루기 위한 것이기 때문에 사용하지 않습니다.대신 텍스트 편집기가 플랫폼의 줄 끝 부분을 기본값으로 하여 항상 새 파일을 저장하도록 하는 것이 좋습니다.
아니요, @jmlane 답은 틀렸습니다.
위해서Checkin (git add, git commit):
- 한다면
text은 재은입니다.Set, Set value to 'auto'이 ' 때 합니다. - 한다면
text은 재은입니다.Unset일도 일어나지 않습니다, for:en은:en입니다.Checkout - 한다면
text은 재은입니다.Unspecified은 에따라변달니다라집이환다▁on에 따라 달라집니다.core.autocrlf- 한다면
autocrlf = input or autocrlf = true변환은 저장소의 파일이 'LF'일 때만 수행되며, 'CRLF'일 경우에는 아무 일도 일어나지 않습니다. - 한다면
autocrlf = false아무 일도 일어나지 않습니다
- 한다면
위해서Checkout:
- 한다면
text은 재은입니다.Unset아무 일도 일어나지 않습니다. - 한다면
text은 재은입니다.Set, Set value to 'auto은 에달있다에 있습니다.core.autocrlf,core.eol.- core.autocolf = 입력: 아무 일도 일어나지 않습니다.
- core.autoclf = true : 저장소의 파일이 'LF', 'LF' -> 'CRLF'일 때만 변환됩니다.
- core : ' -> core인 합니다.autoclf = false : 저장소의 파일이 'LF', 'LF' ->일 때만 변환이 발생합니다.
core.eol
- 한다면
text은 재은입니다.Unspecified은 에달있다에 있습니다.core.autocrlf.- 과 같은
2.1 - 과 같은
2.2 - 일도 않습니다, core.은 요아은, 아일일않다, core.eol은 효과가 .
text은 재은입니다.Unspecified
- 과 같은
기본 동작
따라서 기본 동작은 다음과 같습니다.text은 재은입니다.Unspecified그리고.core.autocrlf = false:
- 체크인 시에는 아무 일도 일어나지 않습니다.
- 체크아웃을 위해, 아무 일도 일어나지 않습니다.
결론들
- 한다면
text가 아닌에 따라 . 체크인 동작은 autocolf가 아닌 자체에 따라 다릅니다. - autocolf 또는 core.eol은 체크아웃 동작을 위한 것이고 autocolf > core.eol
Linux와 Windows 모두에서 테스트를 수행했습니다.저는 LF로 끝나는 줄과 CRLF로 끝나는 줄이 포함된 테스트 파일을 사용합니다.
파일이 커밋되고 제거된 다음 체크아웃됩니다.는 체크아웃 됩니다.autocolf는 커밋 전과 체크아웃 전에 설정됩니다.결과는 아래와 같습니다.
commit core.autocrlf false, remove, checkout core.autocrlf false: LF=>LF CRLF=>CRLF
commit core.autocrlf false, remove, checkout core.autocrlf input: LF=>LF CRLF=>CRLF
commit core.autocrlf false, remove, checkout core.autocrlf true : LF=>LF CRLF=>CRLF
commit core.autocrlf input, remove, checkout core.autocrlf false: LF=>LF CRLF=>LF
commit core.autocrlf input, remove, checkout core.autocrlf input: LF=>LF CRLF=>LF
commit core.autocrlf input, remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF
commit core.autocrlf true, remove, checkout core.autocrlf false: LF=>LF CRLF=>LF
commit core.autocrlf true, remove, checkout core.autocrlf input: LF=>LF CRLF=>LF
commit core.autocrlf true, remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF
core.autocrlf=true로 CRLF -> LF커밋은 모두 잘못된 것입니다!그렇게 간단하지는 않아요 보시다시피...
서류에 따르면 설정이...“text=auto.gitattributes그리고.core.eol하기로 되어 있는crlf config 무엇을 합니까?"... 정히무 뜻입까니슨확?
즉, 파일에 다음이 없으면.gitattributes 텍스트 속성 집합, 그리고 만약core.autocrlf이라true이제 커밋할 파일이 새 파일인지(이 경우 Gitrepo 데이터베이스에서 LF로 정규화됨), 또는 편집하여 커밋 중인 기존 파일인지(이 경우 아무 일도 일어나지 않음)에 따라 달라집니다.도망치지 않는 한git add --renormalize .이 경우 Gitrepo 데이터베이스에서 표준화됩니다.
있잖아요...전체 메커니즘은 오직 a가 있는 파일에만 발생합니다..gitattributes에서는 다음 텍스트 특성의 변형을 배치하지 않았습니다.text,-text,text=auto.
그래서 당신이 정말로 봐야 할 것은 사용하는 것입니다..gitattributes모든 파일의 기본 설정은 다음 중 하나입니다.
* -text
# followed by specialization
이는 모든(전문화 제외) 기본값을 현재 상태로 설정하고 재정의합니다.core.autocrlf전체 또는 기본값 사용:
* text=auto
# followed by specialization
로 자동 되는 모든 제외)이 non-text(텍스트)로 지정되고, " " " " " (으)로 된 모든 파일(전문화 제외)을 합니다.LFgit[see note 1.] 데이터베이스에서, 다음을 얻을 것입니다.CRLF언제든지:
•core.autocrlf이라true또는
•core.eol이라crlf또는
•core.eol이라native(기본값) Windows 플랫폼에 있습니다.
은 다른모경에우, 은신당든을 얻습니다.LF.
어떤 전문화를 의미합니까?를 들어, 를들어들, 어를예예가 있습니다..batfiles beCRLF그리고..shfiles beLF다음 중 하나를 통해:
*.sh text eol=lf
# *.bat
*.[bB][aA][tT] text eol=crlf
또는
# *.sh are committed correctly as-is (LF)
*.sh -text
# *.bat are committed correctly as-is (CRLF)
*.[bB][aA][tT] -text
그래서 네...모든 것이 그렇게 간단하지 않습니다.
[참고 1]:
은 " ▁the▁matching▁files다▁this▁be해니▁alltext=auto속성(즉, 다른 전문화를 가지고 있지 않음), 나는 당신의 레포가 적절하게 정규화되었다고 가정하기 때문입니다..gitattribute되었습니다.
언급URL : https://stackoverflow.com/questions/3206843/how-line-ending-conversions-work-with-git-core-autocrlf-between-different-operat
'codememo' 카테고리의 다른 글
| 이벤트 이미터 메모리 누출이 감지됨 (0) | 2023.05.28 |
|---|---|
| 가시성 간의 차이입니다.축소 및 가시성.히든 (0) | 2023.05.28 |
| 내용을 기준으로 문자열 목록 필터링 (0) | 2023.05.28 |
| IF EXISTS 하위 쿼리와 함께 SQL Select 문을 사용하는 방법은 무엇입니까? (0) | 2023.05.28 |
| Node.js를 사용하여 디렉터리가 없는 경우 디렉터리를 만드는 방법 (0) | 2023.05.28 |