본문 바로가기
Tip +

[Git]인텔리제이 커밋 후 모든 라인 개행 변경점 해결(CRLF/LF 충돌)

by 보리하늘 2020. 12. 4.
반응형

 

 

개발 시 사용하는 툴 정보는 아래와 같습니다.

 

  • IntelliJ : 소스 수정 및 커밋
  • GitKraken : 커밋 내역 확인 및 푸시, 머지

 

그간 잘 사용하던 툴에서 이상한 점이 발견 되었습니다.

 

*상황 요약*
  1. 분명!!! 한 줄 수정
  2. 인텔리제이에서 커밋 (변경 내역 한 줄, 히스토리 내역도 한 줄)
  3. 푸시하기위해 깃크라켄에서 커밋 내역을 확인하는데…!!! 해당 파일 전체 수정...😨

 

 

이때까지만 해도 깃때문일거라는 생각은 묻어둔 채 얼마전 업그레이드한 인텔리제이나 크라켄 문제인줄 알고 폭풍 구글링

 

인텔리제이에서 커밋깃크라켄 공백

인텔리제이 공백 제거

깃크라켄 공백

깃크라켄 모든 라인 공백 삭제 변경점

인텔리제이 편집되지 않은 행 들여쓰기 자동 변경

인텔리제이 후행 공백 자동  제거

인텔리제이 줄 구분 기호

인텔리제이 CRLF LF

.

.

.

 

 

 


결론은 개행 문자 차이

 

 

CR(Carrige Return)

  • 현재 라인에서 캐리지(커서)를 제일 앞으로 이동하는 동작
  • 아스키(13, 0x0D), \r

LF(Line Feed)

  • 종이를 한 라인 위로 올리는 동작
  • 아스키(10, 0x0A), \n

 

 

 

 

줄바꿈을 표현하는 방법은 시스템과 운영 체제에 따라 아래와 같이 차이가 있어요.

 

출처 : wikipedia

 

 

 

제 경우 윈도우에서 작성된 소스코드를 맥에서 수정하다보니

CRLF(\r\n)와 LF(\n)의 충돌로 모든 라인을 수정하는 일이 벌어진것 같아요.

 

 

 

인텔리제이에서는 Editor의 개행 문자를 선택할 수 있습니다.

 

기존에 작성된 파일의 개행 문자가 화면 하단에 표시됩니다. CRLF로 셋팅되어 있네요.

주석 하나를 추가하여 커밋합니다.

 

 

 

 

깃크라켄에서 확인한 커밋의 수정내역 입니다.

모든 라인의 후행에 보이지 않는 공백이 사라지며 파일 전체를 수정한듯 표시됩니다... (매우 당황)

 

 

 

 

맥의 줄바꿈 형식인 LF로 변경해본 뒤 커밋해보았어요.

CRLF에서 LF로 변경되었다고 빨간색과 파란색으로 표시되어 있습니다.

 

 

 

이 경우도 커밋 후 깃크라켄에서 확인해보면 동일합니다.

 

CRLF -> LF 변경 시 모든라인 변경되는건 납득이 가는데,

CRLF -> CRLF 커밋인데도 왜 모든라인이 변경되는가..................! 🤯

 

 

 

삽질의 시간을 보내고 테스트를 거쳐 도출된 해결 방법을 알려드리고자 합니다.

(저처럼 고통받는 분들이 없었으면 좋겠어요..😫)

 

 

 

 

 


Git 설정 변경

 

Git 설정 중 core.autocrlf를 확인합니다.

git config --list

 

core.autocrlf

  • true(windows용) : commit할때 CRLF를 LF를 변환하고 checkout할때 LF를 CRLF로 변환한다.
  • input(*nix용) : commit할때만 CRLF를 LF로 변환한다.
  • false : autocrlf 미사용

 

 

Git config 내 core.autocrlf = input 로 되어있었어요!!! 😧

이 설정 때문에 CRLF인 소스파일 수정 시 모든 라인의 개행문자를 LF로 바꾸기 때문에 모든 라인 수정으로

표시되었던 겁니다......!!!

 

 

자 이제, core.autocrlffalse로 변경합니다.

git config --global core.autocrlf false

 

 

 

변경 후 커밋 시 경고창이 뜹니다!

 

 

IntelliJ와 같이 인텔리한 IDE에서는 core.autocrlf 설정이 되어있지 않은 경우

"You are about to commit CRLF line separators to the Git repository"라는 경고 메시지를 출력합니다.

 

[Fix and Commit] 버튼 클릭 시 core.autocrlf = input으로 설정 해버리기 때문에

[Commit As Is] 버튼을 클릭하여 커밋을 수행하여 core.autocrlf = false를 유지합니다.

 

 

🎊드디어 기존 파일의 개행을 바꾸지 않고 커밋하므로 해당 라인 변경점만 생기게 됩니다!!!!!!!🥳🎉

 

 

 

 

 

 

 

 

참고

https://ko.wikipedia.org/wiki/%EC%83%88%EC%A4%84_%EB%AC%B8%EC%9E%90

http://blog.kiyeon.net/2017/12/12/crlf/

https://reiphiel.tistory.com/tag/intellij%20line%20separator%20warning

728x90
반응형

댓글