기본적으로 깃은 대소문자를 구별하지 못한다
그러므로 파일의 대소문자를 변경하고 push 해도 변경사항이
반영되지 않는다
예를 들면 아래와 같다
로컬 폴더명 SignIn폴더 생성 후 push
아후 로컬 폴더명 SignIn → signin 변경 후 push
깃에서는 대소문자를 구분하지 않으므로 origin에서는
변경되지 않음
그렇지만 그 이후 로컬에서 해당 폴더에서 변경사항이 발생했을 경우 아래와 같은 참조 에러가 발생함
"이미 포함된 'c:/Users/.../src/**SignIn**/...' 파일 이름은 'c:/Users/.../src/**signin**/...' 파일 이름과 대/소문자만 다릅니다.
파일은 다음과 같은 이유로 프로그램에 있습니다.
'c:/Users/.../src/**SignIn**/...' 파일에서 '...'을(를) 통해 가져왔습니다.
'c:/Users/.../VSCode/.../tsconfig.json'의 포함 패턴 'src'(으)로 일치되었습니다.ts(1261)"
git config core.ignorecase false
옵션 적용
위의 옵션을 적용면 git은 대소문자 구분을 하게 된다
또한 , 이전에 예시를 (SignIn → signin) 들었던 것처럼 , 이미 대소문자
변경을 하고 origin에 push 를 했었던 파일이 있다면 그 파일들이
변경사항으로 처리가 돼서 커밋이 가능해진다
추가로
**git rm -r --cached .**
+**git add .
**
명령어를 같이 적용 해 줘야 한다
git config core.ignorecase false 옵션만 적용하고
git status를 해보면 대소문자를 구분하도록 설정했으므로
SignIn 과 signin 2개의 폴더가 동시에 존재한다
이 상태에서 origin에 push하면origin에는 SignIn 과 signin
2개의 폴더가 모두 존재하는 문제가 발생한다
(심지어 기존 SignIn폴더는 git에서 추적조차 되지 않는다)
git rm -r --cached .
명령어로현재 디렉토리와 하위 디렉토리의 모든 파일을 Staging Area에서 제거한다
아래와 같이 모든게 삭제가 되는 것이다
rm '.eslintrc.json'
rm '.gitconfig'
rm '.gitignore'
rm '.prettierrc'
rm 'README.md'
rm 'index.html'
rm 'package-lock.json'
rm 'package.json'
rm 'public/vite.svg'
rm 'src/App.css'
rm 'src/App.tsx'
...
💡 이건 단지 Staging Area에서 사라지는 것일 뿐 ,
실제 파일이 날라가는건 절대 아니므로 괜찮다.
이 명령을 실행하면, 로컬의 파일들은 그대로이지만
Git은 이들 파일을 "새로 추가된 파일(Untracked files)"로 취급하게 된다
git add .
를 실행하면모든 파일이 새로운 설정에 따라 다시 Staging Area에 추가된다
이 때 적용한 core.ignorecase = false가 반영된 상태로 추가가 되는 것이다
이렇게 하면 SignIn 과 signin중 실제로 파일 시스템에 존재하는 폴더만 다시 Staging Area에 추가된다.
즉, 만약 폴더 이름을 signin으로 변경했다면 SignIn는 사라지고, signin만 인덱스에 남게 되는 것이다
이렇게 하면 대소문자 구분 설정에 따라 실제로 존재하는 폴더만
인덱스에 남게 되므로, 이후 커밋에서는 그렇게 반영되는 것이다
협업을 진행하다가 발생할 수 있는 상황이다
- A가 위의 모든 과정을 진행
- 팀원B가 실수로 위의 과정을 진행하지 않고
SignIn → signin 으로 변경 후 push
A가 pull
A의 로컬은 signin 이지만 origin에는 SignIn 으로 남아있음
이후 A 로컬에서도 에러를 발생
"이미 포함된 'c:/Users/.../src/**SignIn**/...' 파일 이름은 'c:/Users/.../src/**signin**/...' 파일 이름과 대/소문자만 다릅니다.
파일은 다음과 같은 이유로 프로그램에 있습니다.
'c:/Users/.../src/**SignIn**/...' 파일에서 '...'을(를) 통해 가져왔습니다.
'c:/Users/.../VSCode/.../tsconfig.json'의 포함 패턴 'src'(으)로 일치되었습니다.ts(1261)"
해결책 역시 origin에 있는 SignIn 을 signin 으로 변경해야 한다
이때의 과정은 기존과 동일하다
git rm -r --cached .
git add .
git config core.ignorecase false
옵션 적용참고 :
협업을 할 때에는 git config core.ignorecase false 옵션을
모든 팀원들이 적용해야 한다
그러므로 팀원들이 보다 간편하게 스크립트로 진행할 수 있도록 설정을 해줄수 있다
repository root에 .gitconfig 파일을 생성하고 추가하고 싶은 설정들을 입력한다.
# .gitconfig
[core]
ignorecase = false
.gitconfig파일에 존재하는 옵션을 적용하려면
아래와 같은 명령어를 사용해야 한다
git config --local include.path ./.gitconfig
// 이때의 경로는 .gitconfig
.gitconfig파일에 존재하는 옵션을 적용하기 위해 사용해야 하는
명령어를 package.json의 scripts에 작성해주고
추가로 git rm -r --cached . 와 git add . 또한 작성해준다
// package.json
"scripts": {
"gitconfig": "git config --local include.path ./.gitconfig"
"gitcase": "git rm -r --cached . && git add ."
}
💡 명령어 끝에 .gitconfig를 명시할 때 , package.json으로부터 .gitconfig가 있는 상대경로를 작성해 줘야 한다
그리고 나서 팀원들에게 해당 명령어를 실행해달라고 해주면 된다