이슈 로그: Git과 파일 이름

제제 🍊·2023년 4월 30일
0
post-thumbnail
post-custom-banner

들어가며

코드가 머지되는 상황에서 종종 빌드 에러가 발생하는 경우가 있다.
여러가지 이유에 의해서 빌드가 깨질 수 있겠지만, 이번 글에서는 파일 이름의 대소문자 수정에 의해 빌드 에러가 발생했던 경우를 다뤄보려고 한다.
해당 빌드 에러는 어떻게 발생하게 되었고, 해결할 수 있을지 Git 설정과 관련하여 알아보도록 하자.

관련 설정

먼저 관련된 git 설정을 알아보자.
git config: core.ignoreCase
파일 시스템 상에서 git이 대소문자를 구분할지,구분하지 않을지 boolean 속성으로 설정할 수 있는데, 설정하는 방법은 다음과 같다.

git config core.ignoreCase false  // 대소문자 구분함
git config core.ignoreCase true   // 대소문자 구분하지 않음

default 값은 false이나, git clone 또는 git init을 통해 레포지토리가 생성될 때 core.ignoreCase 값이 true로 설정되는 듯하다.

core.ignoreCase=true

core.ignoreCase 값이 true 일 때 어떻게 동작하는지 직접 알아보자.
remote 레포지토리가 하나 필요하다.
만들자.

local에서 testfile.txt를 생성하고, remote에 올려보자.

local에서 파일탐색기 기능을 통해 testfile.txt를 testFile.txt로 이름을 바꾸고, git status로 확인해보자.

아무런 변경사항이 확인되지 않는다는 것을 알 수 있다.
즉, 깃이 testfile.txt와 testFile.txt를 같은 파일로 인식한다는 것이다.
파일 말고 폴더는 어떨까?
root/testfolder와 root/testfolder/testone.txt를 만들고, remote에 올려보자.

local에서 파일탐색기 기능을 통해 testfolder를 testFolder로 이름을 바꿔보자.
git status로 확인해보자.

역시나 아무런 변경사항이 확인되지 않는다는 것을 알 수 있다.
즉, 깃이 testfolder와 testFolder를 같은 폴더로 인식한다는 것이다.
testone.txt를 testOne.txt로 이름을 바꿔서 확인해봐도 위와 같은 결과를 볼 수 있을 것이다.
궁금하면 확인해봐도 좋다.

core.ignoreCase=false

그럼 core.ignoreCase 값이 false 일 때는 어떻게 동작하는지 알아보자.
먼저 레포지토리를 비우자.
local에서 testfile.txt를 생성하고, remote에 올려보자.
그러고 나서 local에서 파일탐색기 기능을 통해 testfile.txt를 testFile.txt로 이름을 바꿔보자.
git status로 확인해보자.

아직 아무런 변경사항이 확인되지 않는다는 것을 알 수 있다.
이제 core.ignoreCase 상태를 false로 바꿔주면?

git config core.ignoreCase false
git status

오~~
근데 Untracked files에 testFile.txt가 있는게 쎄하다.
remote에 올려보자.

ㅋㅋ
testfile.txt가 testFile.txt과 함께 증식했다.

git status에서 확인할 수 있었듯이 git이 testfile.txt가 testFile.txt로 modified 된 것으로 인식하는 게 아니라,
testfile.txt는 그대로 존재하고, testFile.txt가 새롭게 생성된 것으로 인식하는 듯 하다.
우째 이런 일이

local에서 파일탐색기를 통해 testFile.txt를 삭제하면 어떻게 될까?
testFile.txt를 삭제하고, git status로 확인해보자.

오…
testFile.txt 뿐만 아니라, 파일 탐색기에 보이지 않았던 testfile.txt까지 deleted 상태로 확인된다.
이대로 커밋하고 푸시하면?

예상할 수 있듯이 파일이 모두 삭제된다.

폴더는?

파일 말고 폴더는 어떨까?
root/testfolder와 root/testfolder/testone.txt를 만들고, remote에 올려서 앞선 테스트를 반복해보면 똑같이 동작하는 것을 알 수 있다.

지금까지 정리

지금까지 상황을 정리하자면,
먼저 git config에 core.ignoreCase가 true일 경우에는, local에서 파일 탐색기를 통해 파일 이름의 대소문자를 변경하는 경우, git이 변경을 인식하지 못해 commit 할 사항이 존재하지 않았다.

반면 git config에 core.ignoreCase가 false일 경우에는, local에서 파일 탐색기를 통해 파일 이름의 대소문자를 변경하는 경우, git이 기존 파일의 이름이 변경된 것이 아니라 새로운 파일이 생성된 것으로 인식해 Untracked files로 확인됐다.

첫번째와 같이 git이 “파일 이름의 변경을 인식하지 못하는 것”과,
두번째와 같이 git이 “기존 파일에 더해 기존 파일 이름의 대소문자가 변경된 새로운 파일이 생성되는 것”은 원하는 바가 아니다.

그렇다면, 파일이름의 대소문자를 어떻게 바꿔야 git이 “기존 파일 이름의 대소문자가 변경된 것”으로 인식할 수 있을까?

두가지 방법이 존재한다. 참고로 설정 값은 core.ignoreCase=true 이다.

1. 파일 이름을 수정하고, 커밋하고, 수정하고, 커밋한다.

local과 remote에 testfile.txt가 있는 상태이다.
파일 탐색기에서 testfile.txt를 tempFile.txt로 이름을 바꾸자.

testfile.txt가 deleted 상태이고, tempFile.txt가 Untracted files 상태인 것을 확인할 수 있다.
모두 스테이징하여 커밋해주자.
그러면 이제 testfile.txt 대신 tempFile.txt가 존재하고, 작업 트리는 깨끗한 상태가 된다.

이 상태에서 tempFile.txt를 testFile.txt로 수정해보자.

스테이징하고 커밋해서 remote에 올려줍시다.
그러면~

우리가 원했던 testfile.txt 에서 testFile.txt로의 변경이 이루어진 것을 확인할 수 있다.

2. git mv 명령어를 사용한다.

다시 local과 remote에는 testfile.txt가 있는 상태이다.
그 상태에서 아래와 같은 명령어를 입력해주자.

git mv testfile.txt testFile.txt

그리고 git status 를 확인해보자.
testfile.txt가 testFile.txt로 renamed된 상태로 확인된다!
이미 스테이징 되어 있는 상태이니 커밋하고 remote에 push해주자.

그럼 원했던 대로 testfile.txt가 testFile.txt로 변경되어 remote에 올라가게 됩니다!

마무리

지금까지 파일 이름의 대소문자를 수정하며 겪을 수 있는 문제 상황을 다뤄보았다. git의 설정과 명령어를 사용하여 문제를 해결하는 방법을 알아보았는데, git이 어떤 방식으로 프로젝트를 관리하는지 확실히 이해하면 더 다양한 문제들에 대해서 능동적으로 해결할 수 있을 것이라고 생각한다. git의 버전관리에 대해 더 깊이 이해하면 재밌을 것 같ㄷ.

profile
블로그 꿈나무 🌱
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 5월 2일

최근에 대소문자 변경하다가 개고생했는데... 그때를 떠올리며 잘 읽고 갑니다... ^-^

답글 달기