[TOJ] 개발기록 - git config core.ignorecase false 옵션으로 git 대소문자 구분 적용하기

조민호·2023년 11월 9일
2
post-custom-banner


상황

기본적으로 깃은 대소문자를 구별하지 못한다

그러므로 파일의 대소문자를 변경하고 push 해도 변경사항이

반영되지 않는다

예를 들면 아래와 같다

  1. 로컬 폴더명 SignIn폴더 생성 후 push

  2. 아후 로컬 폴더명 SignIn → signin 변경 후 push

  3. 깃에서는 대소문자를 구분하지 않으므로 origin에서는

    변경되지 않음

  4. 그렇지만 그 이후 로컬에서 해당 폴더에서 변경사항이 발생했을 경우 아래와 같은 참조 에러가 발생함

    "이미 포함된 '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 . 명령어로
    1. 현재 디렉토리와 하위 디렉토리의 모든 파일을 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에서 사라지는 것일 뿐 , 실제 파일이 날라가는건 절대 아니므로 괜찮다.
    2. 이 명령을 실행하면, 로컬의 파일들은 그대로이지만
      Git은 이들 파일을 "새로 추가된 파일(Untracked files)"로 취급하게 된다

  • 여기서 git add .를 실행하면
    1. 모든 파일이 새로운 설정에 따라 다시 Staging Area에 추가된다

      이 때 적용한 core.ignorecase = false가 반영된 상태로 추가가 되는 것이다

      이렇게 하면 SignIn 과 signin중 실제로 파일 시스템에 존재하는 폴더만 다시 Staging Area에 추가된다.

      즉, 만약 폴더 이름을 signin으로 변경했다면 SignIn는 사라지고, signin만 인덱스에 남게 되는 것이다

    2. 이렇게 하면 대소문자 구분 설정에 따라 실제로 존재하는 폴더만

      인덱스에 남게 되므로, 이후 커밋에서는 그렇게 반영되는 것이다



상황에 따른 대처

협업을 진행하다가 발생할 수 있는 상황이다

  1. A가 위의 모든 과정을 진행
  2. 팀원B가 실수로 위의 과정을 진행하지 않고
SignIn → signin 으로 변경 후 push
  1. A가 pull

  2. A의 로컬은 signin 이지만 origin에는 SignIn 으로 남아있음

  3. 이후 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 .
  • 커밋 후 push
  • B의 로컬에서 git config core.ignorecase false 옵션 적용


생산성을 위해 명령어로 간편하게 사용하기

참고 :

Git 설정 파일 팀원들과 공유하기

협업을 할 때에는 git config core.ignorecase false 옵션을

모든 팀원들이 적용해야 한다

그러므로 팀원들이 보다 간편하게 스크립트로 진행할 수 있도록 설정을 해줄수 있다

  1. repository root에 .gitconfig 파일을 생성하고 추가하고 싶은 설정들을 입력한다.

    # .gitconfig
    [core]
        ignorecase = false

    .gitconfig파일에 존재하는 옵션을 적용하려면

    아래와 같은 명령어를 사용해야 한다

    git config --local include.path ./.gitconfig
    // 이때의 경로는 .gitconfig
  1. .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가 있는 상대경로를 작성해 줘야 한다

그리고 나서 팀원들에게 해당 명령어를 실행해달라고 해주면 된다

post-custom-banner

0개의 댓글