git repo 및 작업 복사본에서 LF eol 강제 실행


170

github에서 호스팅되는 git 저장소가 있습니다. 많은 파일이 처음에 Windows에서 개발되었으므로 줄 끝을 너무 조심하지 않았습니다. 초기 커밋을 수행 할 때 올바른 줄 끝을 적용하기 위해 git 구성이 없었습니다. 결론은 내 github 저장소에 CRLF 줄 끝이있는 많은 파일이 있다는 것입니다.

Linux에서 부분적으로 개발 중이며 줄 끝을 정리하고 싶습니다. github에서 LF를 사용하여 파일이 올바르게 저장되고 작업 복사본에 LF가 있는지 어떻게 확인할 수 있습니까?

; .gitattributes포함 하는 파일을 설정했습니다 text eol=LF. 그 맞습니까? 커밋되고 푸시 된 상태에서 rm로컬 리포지토리와 github에서 다시 복제하여 원하는 효과를 얻을 수 있습니까?




그것들 중 어느 것도 내가 요구하는 것이 아닙니다. 나는 유일한 개발자이고 모든 머신을 동일하게 설정하려고합니다. CRLF 파일이 이미 커밋되어 있고 다른 컴퓨터에 몇 개의 복제본이있는 기존 저장소가 있습니다. LF가 어디에 있도 록 리포지토리와 작업 복사본을 어떻게 업데이트 할 수 있습니까?
Chowlett

Github 가이드를 보셨습니까 ?
Andy

답변:


237

저장소에있는 파일 (순수한 소스 코드, 이미지, 실행 파일 등)에 대한 정보가 없으면 질문에 대답하기가 약간 어렵습니다. :)

이 외에도 Windows 또는 Linux에서 작업 할 때 텍스트 파일이 .git 저장소에 LF 줄 끝이 있는지 확인하기 때문에 작업 디렉토리에서 줄 끝으로 LF를 기본값으로 사용하려고합니다. . 정말로 미안보다 안전합니다 ....

그러나 더 좋은 대안이 있습니다. Linux workdir에서 LF 줄 끝, Windows workdir에서 CRLF 줄 끝 및 저장소에서 LF 줄 끝의 이점을 누리십시오.

Linux 및 Windows에서 부분적으로 작업 할 때로 core.eol설정되어 native있고 core.autocrlf로 설정되어 있는지 확인하십시오 true.

그런 다음 .gitattributes파일 내용을 다음으로 바꿉니다.

* text=auto

이를 통해 Git은 커밋 및 체크 아웃시 자동 줄 끝 변환을 처리 할 수 ​​있습니다. 이진 파일은 변경되지 않으며 텍스트 파일로 감지 된 파일은 줄 끝이 즉시 변환되는 것을 볼 수 있습니다.

그러나 저장소의 내용을 알고 있으므로 Git에 손을 대고 바이너리 파일에서 텍스트 파일을 감지하는 데 도움을 줄 수 있습니다.

C 기반 이미지 처리 프로젝트에서 작업 한 경우 .gitattributes파일 내용을 다음으로 바꿉니다.

* text=auto
*.txt text
*.c text
*.h text
*.jpg binary

이렇게하면 확장자가 c, h 또는 txt 인 파일이 리포지토리에 LF 줄 끝과 함께 저장되고 작업 디렉토리에 기본 줄 끝이 나타납니다. JPEG 파일은 건드리지 않습니다. 다른 모든 것들은 위에서 본 것과 동일한 자동 필터링 기능을 활용할 수 있습니다.

이 모든 것의 내부 세부 사항에 대해 더 깊이 이해하려면 Githubber의 Tim Clem의 "마지막 끝을 염두에 두십시오"라는 좋은 글을 읽어 보시기 바랍니다.

실제 예를 들어, 파일 에 대한 변경 사항을 보여주는 커밋을 엿볼 수도 있습니다 .gitattributes.

다음 의견을 고려하여 답변을 업데이트하십시오.

Linux 환경이 실제로 Windows 디렉토리를 공유하는 VirtualBox이기 때문에 실제로 Windows 디렉토리에 CRLF를 원하지 않습니다.

말이된다. 설명해 주셔서 감사합니다. 이 특정 상황에서 .gitattributes파일 자체로는 충분하지 않습니다.

저장소에 대해 다음 명령을 실행하십시오.

$ git config core.eol lf
$ git config core.autocrlf input

리포지토리가 Linux와 Windows 환경간에 공유되므로 두 환경에 대한 로컬 구성 파일이 업데이트됩니다. core.eol체크 아웃시 텍스트 파일에 LF 줄 끝이 있는지 확인하십시오. core.autocrlf보장합니다 잠재적 인 텍스트 파일에 CRLF 저장소에 LF로 변환됩니다 (사본의 결과를 / 예를 들어 작업을 붙여 넣습니다).

선택적으로, 힘내 무엇을 구별 할 수 있도록 할 수 있습니다 작성하여 텍스트 파일 .gitattributes에 다음과 유사한 것을 포함 파일 :

# Autodetect text files
* text=auto

# ...Unless the name matches the following
# overriding patterns

# Definitively text files 
*.txt text
*.c text
*.h text

# Ensure those won't be messed up with
*.jpg binary
*.data binary

.gitattributes파일 을 작성하기로 결정한 경우 커밋하십시오 .

마지막으로, "커밋 할 작업 없음 (작업 디렉토리 정리)"을git status 언급 한 후 다음 작업을 수행하십시오.

$ git checkout-index --force --all

그러면 설정 변경 및 .gitattributes파일 을 고려 하여 텍스트 파일에서 간과 될 수있는 CRLF를 대체 하여 작업 디렉토리에서 파일을 다시 작성합니다 .

이 작업이 완료되면 작업 디렉토리의 모든 텍스트 파일에 LF 줄 끝이 표시되며 git status여전히 workdir을 깨끗한 것으로 간주해야합니다.


34
Linux 환경이 실제로 Windows 디렉토리를 공유하는 VirtualBox이기 때문에 실제로 Windows 디렉토리에 CRLF를 원하지 않습니다. 메모장 ++ 등은 Windows에서 LF 전용을 처리 할 수 ​​있지만 viCRLF에는 만족하지 않습니다. 난 그냥 그 있도록 변경 하시겠습니까 core.autocrlf이다 false(또는 input)?
Chowlett

5
훌륭한 답변입니다. 이 설정을 사용하는 다른 사람을위한 간단한 참고 사항 : "* text = auto"행은 .gitattributes 파일의 첫 번째 행이어야하므로 후속 행이 해당 설정을 무시할 수 있습니다.
Ari Patrick

9
@CMCDragonkai 쉘에 따라 git checkout-index --force --all더 잘 작동 할 수 있습니다. 두 번째 요점은 원래 질문에 관한 약간의 주제를 보여줍니다. 전용 질문을하는 것은 어떻습니까?
nulltoken

8
.gitattributes가 Linux와 Windows간에 작업 복사본을 공유하는 경우를 처리 할 수없는 이유를 이해하지 못합니다. 우리는 설정할 수 없습니다 texteol=lf를 통해 당신의 대답에 설명 된대로 동일한 결과를 달성 core.eol하고 core.autocrlf?
DanielSank

10
git checkout-index --force --all나를 위해 아무것도하지 않습니다. 작동하는 것은 이 문제를 다루기위한 GitHub 명령어의 명령 목록입니다 .
로마 스타 코프

126

git 2.10 (2016-09-03 릴리스)부터 각 텍스트 파일을 별도로 열거 할 필요는 없습니다. Git 2.10은 eol = lf와 함께 text = auto의 동작을 수정했습니다 . 소스 .

.gitattributes git 저장소의 루트에있는 파일 :

* text=auto eol=lf

추가하고 커밋하십시오.

그런 다음 단계를 수행하면 모든 파일이 표준화됩니다.

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

출처 : kenorb의 답변 입니다.


7
Git 2.10은 2016 년 9 월 3 일에 출시되었습니다.
stil

나는 이것을 실행했고 그것은 텍스트가 아닌 모든 파일
Anthony

바이너리 모드를 특정 파일로 명시 적으로 설정할 수 있습니다. -왜 자동 감지가 일부 파일에서 끊어 졌는지 궁금합니다.
koppor

이것이 정답입니다.
CletusW

25

모든 텍스트 파일에 대해 LF 행 끝을 강제로 적용하려면 .gitattributes다음 행을 사용하여 저장소의 최상위 레벨에 파일을 작성 하십시오 (원하는대로 변경).

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

이것은 Git이 텍스트 파일로 간주하는 모든 파일이 LF저장소에서 정규화 된 ( ) 줄 끝을 갖도록 합니다 (일반적으로 core.eol구성은 기본적으로 어떤 파일을 가지고 있는지 제어합니다).

새로운 속성 설정에 따라 CRLF를 포함하는 모든 텍스트 파일은 Git에 의해 정규화되어야합니다. 이 작업이 자동으로 수행되지 않으면 줄 끝을 변경 한 후 리포지토리를 수동으로 새로 고칠 수 있으므로 다음 단계 (깨끗한 작업 디렉토리가 제공됨)로 작업 디렉토리를 다시 스캔하고 커밋 할 수 있습니다.

$ echo "* text=auto" >> .gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

또는 GitHub 문서에 따라 :

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

@Charles Bailey post 도 참조하십시오 .

또한 텍스트로 취급되지 않는 파일을 제외하려면 해당 텍스트 속성을 설정 해제하십시오. 예 :

manual.pdf      -text

또는 명시 적으로 바이너리로 표시하십시오.

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

좀 더 고급 git 정규화 파일을 보려면 Drupal core.gitattributes 에서 확인하십시오 .

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

또한보십시오:


2
1. text=auto오해의 소지가 있습니다. 당신은 사용할 수 없습니다 text=autoeol함께. 설정 eol하면 텍스트 파일 자동 감지가 비활성화됩니다. 그렇기 때문에 모든 파일 형식을 지정해야합니다. auto활성화 된 경우 에는이 모든 것이 필요하지 않습니다. 2. 당신은 필요하지 않습니다 texteol=lf. eol=lf효과적으로 설정합니다 text.
Ben

2
@Ben이 말한 두 번째로, 모든 바이너리 파일을 명시 적으로 표시하지 않으면이 구성이 현재 잘못되어 위험합니다.
Michael R

1
* text=auto eol=lf첫 번째 text=auto가에 의해 재정의 되었음을 읽었습니다 eol=lf. 이 기능은 어디에서 찾았습니까? 내 소스는 다음과 같습니다. stackoverflow.com/questions/29435156/…
CMCDragonkai 2016 년

제거 * text=auto eol=lf가 된 이후, 예로부터 제거 뿐만 아니라 드루팔에서. 주석도 제거하십시오.
kenorb

4
@Ben이 말한 것이 더 이상 사실이 아니며 항상 버그였습니다-의도 된 행동이 아닙니다.
Semmel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.