GIT은 파일의 대소문자를 구분하지 못한다?

도도묵·2023년 5월 20일
post-thumbnail
최근 회사에서 rebase 작업을 하던 중 낮선 에러가 발생하게 되었다.

cannot find file : 'serviceJoinModule': File exists

해석하면 serviceJoinModule이라는 파일이 이미 존재하기 때문에 해당 파일을 찾을수 없다는 뜻이다.

.......        뭔 소리야...?


  상황을 설명하자면 기존 ServiceJoinModule.ts의 파일 이름이 serviceJoinModule로 변경된 뒤 원격저장소에 push되었다. 그러나 원격저장소에는 serviceJoinModule.ts 뿐만 아닌 ServiceJoinModule.ts 파일도 같이 올라가게 된 것이다. git이 이 두개의 파일을 별개라고 판단한 것이다.

로그 ea4aa98의 test.ts의 파일명이 Test.ts로 수정되어 커밋되었다.
그러나 원격 저장소에는 Test/test 파일 두개가 공존




...




  결론부터 말하면 이는 git이 파일의 대소문자 구분을 무시하기 때문이다. git의 config 환경에는 파일 및 업데이트 인식 방법, 캐싱, 압축 등 Git 동작의 "core"를 제어하는 core 옵션이 존재한다. 우리는 git을 사용할때 이 코어가 제공해주는 옵션에 설정에 맞게 파일을 저장소에 올리고는 하는데, 대부분 코어를 건드릴 일이 없기 때문에 기본 환경 세팅에 맞게 사용 하고 있다. 이때 파일의 대소문자 구분을 무시하는 ignorecase 역시 true로 초기 설정되어 있는 것이다. 때문에

git config (option: --global) core.ignorecase false

를 통해 대소문자에 대한 구분을 인지시킬수 있다.

(2023.05.20 추가)

git 명령어
mv : 대/소문자를 구분하지 않는 파일 시스템에서 대/소문자를 구분하지 않고 이름을 변경할 수 있다.

git mv --force '기존파일(source)' '변경할 파일(destination)'



mv 명령어를 통해 파일 이름을 변경하게 되면
기존 과는 다르게 파일을 Renamed로 인식하는 것을 볼 수 있다.


커밋하면 test.ts 가 Test.ts로 변경된걸 확인 할 수 있다.

원격 저장소에서도 정상적으로 변경되었다.





번외:


로컬 저장소에서 파일을 지웠는데도 불구하고 원격 저장소에 파일이 남아있어 충돌이 발생하면 기존 파일 삭제 명령어 rm에 cached를 추가한다.

git rm --cached -r 파일명

해당 명령어를 통해 원격 저장소의 파일을 삭제 할 수 있다.



profile
나만의 성장 일기

0개의 댓글