AI Coding

Git과 대소문자의 숨바꼭질: 윈도우가 "button"을 놓친 이유

Brewed on 2025년 12월 1일

“이거 그냥 올려도 돼?”

Button.astro 컴포넌트를 만들던 중이었다. 처음엔 실수로 소문자 button.astro로 파일을 만들었다가, 컴포넌트 이름 규칙(PascalCase)에 맞춰 대문자 Button.astro로 이름을 바꿨다.

VS Code 탐색기에서도 분명 Button.astro로 잘 보였다. 그런데 터미널에 이런 에러 메시지가 떴다.

Error: Already included file name ’…/Button.astro’ differs from file name ’…/button.astro’ only in casing.

나는 AI 파트너(Gemini)에게 물었다. “내 컴퓨터에서는 이미 대문자로 바꿨고 잘 보이는데, 그냥 git push 해도 되는 거 아냐? 어차피 파일 내용은 똑같잖아.”

돌아온 대답은 단호했다. “절대 안 됩니다! 배포가 실패할 확률 99%입니다.”


사건의 전말: 윈도우와 리눅스의 동상이몽

이 문제는 내 컴퓨터(Windows)와 배포 서버(Cloudflare/Linux)가 ‘대소문자’를 대하는 태도가 정반대라서 발생하는 착시 현상이었다.

1. 윈도우(Windows): “대소문자? 그게 그거지!”

윈도우는 대소문자를 구분하지 않는다(Case-Insensitive). 윈도우에게 buttonButton은 그냥 같은 파일이다. 그래서 내가 파일명을 b에서 B로 바꿔도, 윈도우는 “내용은 그대로고 이름표만 살짝 고쳤네? 별거 아니군.” 하고 Git에게 변경 사항을 강하게 어필하지 않는다.

Git 또한 윈도우 환경에서는 기본적으로 ignorecase = true 설정이 되어 있어, 이 미세한 변화를 감지하지 못하고 넘어간다.

2. 리눅스(Linux): “완전히 다른 파일이야!”

문제는 내 코드가 올라갈 Cloudflare 서버가 리눅스 기반이라는 점이다. 리눅스는 대소문자를 엄격하게 구분한다(Case-Sensitive).

  • 코드: import Button from './Button.astro' (대문자 파일 가져와!)
  • Git이 보낸 파일: button.astro (윈도우가 소문자라고 해서 소문자로 보냄)
  • 리눅스 서버: “야, Button.astro 내놓으라니까 왜 button.astro를 줘? 난 그런 파일 몰라!” (Build Error 💥)

내 눈에는 대문자로 보였지만, Git 장부에는 여전히 소문자로 기록되어 있었고, 그게 서버로 넘어가면서 사단이 나는 것이다.


해결책: Git에게 “눈치” 주기 (Rename Dance)

Git이 윈도우의 둔감함 때문에 변화를 눈치채지 못한다면, 충격 요법을 써서 강제로 인식시켜야 한다. 일명 이름 세탁(Rename Dance)이다.

Step 1. 아예 다른 이름으로 바꾸기

button.astroButton_temp.astro

  • Git: “어? button이 삭제되고 temp가 새로 생겼네? 이건 확실히 변했다! 기록하자.”

Step 2. 원래 원하는 이름으로 바꾸기

Button_temp.astroButton.astro

  • Git: “어? temp가 사라지고 Button(대문자)이 생겼네? 이것도 기록하자.”

이렇게 중간 단계를 거치면 Git은 비로소 Button을 새로운 파일로 인식하고 서버에 대문자 이름을 정확하게 전달한다.


마치며

우리가 보는 화면(GUI)과 컴퓨터 내부(System)의 사정은 다를 때가 많다. 특히 협업이나 배포 환경이 내 컴퓨터 OS와 다를 때는 사소해 보이는 ‘철자 하나’가 시스템 전체를 멈추게 할 수도 있다.

오늘의 교훈: “파일 이름 바꿀 때는 Git의 눈치를 살피자.”

🍵

Brewed by JIYU

AI와 함께 코딩하고, ARM 윈도우 위에서 글을 씁니다.
기술의 스펙보다는 그 안에 담긴 논리(Logic)와 경험을 기록합니다.