글쓴이 보관물: YOUNGMIN JUN

YOUNGMIN JUN에 대하여

컴퓨터 : 맥북프로 레티나 13인치, 아이맥 27인치, 소니 TT16, 서피스2 RT, 서피스2 프로, 후지찌 P1610

Git에서 CRLF 개행 문자 차이 해결법

Windows에서는 Line Breaking으로 CR(Carriage-Return, \r)LF(Line Feed, \n)을 사용하고 UnixMac OS에서는 LF만 사용한다.
이로 인해서 실제 코드는 변경된게 없는데 소스의 CR/LF 때문에 변경으로 인식하여 Commit을 하게되는 문제가 발생된다. 이런 문제를 해결하기 위해서 OS가 달라도 문제가 없도록 CRLF에 대한 설정을 해줘야 한다.

core.eol

git에서 Line Breaking을 어떻게 처리할지에 대한 항목

  • native
  • 기본설정. 시스템에서 Line Breaking을 처리하는 방법에 따른다. Windows에서는 CRLF를 사용하고 Linux, OS XLF만 사용
  • crlf
  • CRLFLine Breaking으로 사용
  • lf
  • LFLine Breaking으로 사용

설정방법

## 설정
git config --global core.eol native

## 설정 확인
git config --global --list | grep core.eol

core.autocrlf

git은 저장소 메타 데이타 디렉터리인 .git 폴더에 모든 이력 데이타를 갖고 있다. 이력 데이타는 key/value 형식의 데이타베이스이며 core.autocrlftext filegit object databasecheckin, checkout 할때 어떻게 처리할지를 설정하는 변수

  • false
  • 기본 설정. 파일에 CRLF를 썼든 LF를 썼든 git은 상관하지 않고 파일 그래도 checkin, checkout한다. 이 설정은 Line Breaking이 다른 OS에서는 text file이 변경되었다고 나오므로 위에서 언급한 여러 가지 문제가 발생할 수 있다.
  • true
  • text fileobject database에 넣기전에 CRLF를 LF로 변경
  • input
  • LFLine Breaking으로 사용

해결방법1 – autocrlf 설정 사용

OS별 CRLF 차이로 인한 문제를 막기 위해 OS별로 다음과 같이 설정을 한다.

Windows

Windows에서는 CRLF를 사용하므로 저장소에서 가져올 때 LF를 CRLF로 변경하고 저장소로 보낼 때는 CRLFLF로 변경하도록 true로 설정

git config --global core.autocrlf true

LINUX, MAC OS

리눅스, 맥, 유닉스는 LF만 사용하므로 input으로 설정

git config --global core.autocrlf input

해결방법2 – .gitattributes 사용

git은 텍스트 파일의 속성을 .gitattributes 파일을 통해 설정할 수 있으며 여기에는 CRLF 처리도 지정할 수 있다. .gitattributes 를 저장소에 커밋하면 다른 클라이언트는 별도의 설정이 필요없다.

# Auto detect text files and perform LF normalization
*        text=auto

*.cs     text diff=csharp
*.java   text diff=java
*.html   text diff=html
*.css    text
*.js     text
*.sql    text

*.csproj text merge=union
*.sln    text merge=union eol=crlf

*.docx   diff=astextplain
*.DOCX   diff=astextplain

# absolute paths are ok, as are globs
/**/postinst* text eol-lf

# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol-lf

* 만약 git clientegit을 사용하면 .gitattributes 를 읽지 못해 제대로 동작을 안 하므로 방법1의 autocrlf를 사용하는 것이 좋다.

참고주소

  • https://www.lesstif.com/pages/viewpage.action?pageId=20776404

Git 최초 설정

Git을 설치하고 나서 Git의 git config를 통해서 시스템에 맞는 환경 설정을 해줘야 한다.

설정파일

  1. /etc/gitconfig :
    • 시스템의 모든 사용자와 모든 저장소에 적용되는 설정파일. git config --system 옵션으로 이 파일을 읽고 쓸 수 있다.
    • 이 파일은 시스템 전체 설정파일이기 때문에 수정하려면 시스템의 관리자 권한이 필요한다.
  2. ~/.gitconfig, ~/.config/git/config :
    • 특정 사용자(즉 로그인된 현재 사용자)에게만 적용되는 설정으로 git config --global 옵션으로 이 파일을 읽고 쓸 수 있다.
    • 특정 사용자의 모든 저장소 설정에 적용된다.
  3. .git/config :
    • 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다.
    • git config --local 옵션을 사용하면 이 파일을 사용하도록 지정할 수 있다.

설정 파일 우선 순위

각 설정은 역순으로 우선시 된다.

.git/config > ~/.gitconfig, ~/.config/git/config > /etc/gitconfig

사용자 정보 설정

Git을 설치하고 나서 가장 먼저 해야 하는 것은 사용자 이름과 이메일 주소를 설정하는 것이다. Git은 Commit 할 때마다 이 정보를 사용한다. 한 번 커밋한 후에는 정보를 변경할 수 없다.

git config --global user.name "YOUNGMIN JUN"
git config --global user.email youngmin.jun@gmail.com

만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶다면 --global 옵션을 빼고 명령을 실행하고, 각 프로젝트마다 해당 정보를 기입해야 한다.

설정 확인

git config --list 명령을 실행하여 Git에 설정되어 있는 값을 확인 할 수 있다.

user.name=YOUNGMIN JUN
user.email=youngmin.jun@gmail.com
core.autocrlf=true
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
...
filter.lfs.required=true
credential.helper=manager
add.interactive.usebuiltin=true

참고자료

  • https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95