콘텐츠로 이동

중첩된 .git 디렉토리로 인한 Git adding files failed 오류 해결

Git Add 를 하니 adding files failed 에러가 발생했다.

여러 개의 프로젝트를 하나의 Git Repository 안에서 관리하던 중, 새로 생성한 NestJS 프로젝트를 커밋하려고 하자 git add 단계에서 실패했다.

GitRepository
├── A Project
├── B Project
├── C Project
├── D Project
└── E Project (new project)

에러 메시지는 아래와 같았다.

Terminal window
error: '${PROJECT_NAME}/' does not have a commit checked out
fatal: adding files failed

하위 프로젝트 안에 별도의 .git 디렉토리가 있었다.

에러 메시지를 기준으로 확인해 보니, 상위 저장소 안에 새로 만든 프로젝트 내부에 또 다른 .git 디렉토리가 들어 있었다.

이번 환경에서는 Nest CLI로 새 프로젝트를 만들었을 때, 생성된 하위 프로젝트 안에 .git 디렉토리와 .gitignore가 함께 들어 있었다.

구조를 정리하면 이런 형태였다.

GitRepository
├── A Project
├── B Project
├── C Project
├── D Project
├── E Project (new project)
│ ├── .git
│ └── .gitignore
├── .git
└── .gitignore

Git은 상위 저장소 안에서 다시 독립 저장소처럼 보이는 디렉토리를 만나면, does not have a commit checked outadding files failed 같은 에러를 낼 수 있다.

즉 이번 문제의 핵심은 모노레포처럼 관리하던 상위 저장소 안에 하위 프로젝트용 .git이 중첩돼 있었다는 점이었다.

새로 생성한 하위 프로젝트 안의 .git만 제거한다. (중첩 파일 제거)

해결 방법은 단순했다. 상위 저장소의 .git이 아니라, 새로 생성한 하위 프로젝트 내부의 .git만 삭제하면 된다.

예를 들어 새 프로젝트가 E Project라면 아래처럼 하위 프로젝트 기준으로 정리한다.

Terminal window
cd E Project
rm -rf .git .gitignore

또는 상위 저장소 루트에서 경로를 명시해 지울 수도 있다.

Terminal window
rm -rf E Project/.git E Project/.gitignore

이후 다시 상위 저장소에서 git add를 실행하면 정상적으로 파일을 스테이징할 수 있었다.


1) 지우는 대상은 하위 프로젝트의 .git이다

섹션 제목: “1) 지우는 대상은 하위 프로젝트의 .git이다”
  • 상위 저장소 루트에서 rm -rf .git를 실행하면 안 된다.
  • 반드시 새로 만든 하위 프로젝트 안의 .git만 지워야 한다.

2) 모노레포 구조에서는 중첩 저장소를 먼저 의심한다

섹션 제목: “2) 모노레포 구조에서는 중첩 저장소를 먼저 의심한다”
  • 상위 저장소 안에 새 프로젝트를 생성했는데 git add가 실패하면 내부에 .git이 한 번 더 생겼는지 먼저 확인하는 편이 빠르다.
  • 하위 프로젝트 안에 .git이 있는지
  • 하위 프로젝트 안에 별도 .gitignore가 생겼는지
  • 상위 저장소 루트의 .git을 잘못 건드리지 않았는지
  • 중첩된 .git 디렉토리를 빠르게 확인하려면 아래 명령을 사용할 수 있다.
    • Terminal window
      find . -name .git -type d