중첩된 .git 디렉토리로 인한 Git adding files failed 오류 해결
Issue
섹션 제목: “Issue”Git Add 를 하니 adding files failed 에러가 발생했다.
여러 개의 프로젝트를 하나의 Git Repository 안에서 관리하던 중, 새로 생성한 NestJS 프로젝트를 커밋하려고 하자 git add 단계에서 실패했다.
GitRepository ├── A Project ├── B Project ├── C Project ├── D Project └── E Project (new project)에러 메시지는 아래와 같았다.
error: '${PROJECT_NAME}/' does not have a commit checked outfatal: adding files failedCause
섹션 제목: “Cause”하위 프로젝트 안에 별도의
.git디렉토리가 있었다.
에러 메시지를 기준으로 확인해 보니, 상위 저장소 안에 새로 만든 프로젝트 내부에 또 다른 .git 디렉토리가 들어 있었다.
이번 환경에서는 Nest CLI로 새 프로젝트를 만들었을 때, 생성된 하위 프로젝트 안에 .git 디렉토리와 .gitignore가 함께 들어 있었다.
구조를 정리하면 이런 형태였다.
GitRepository ├── A Project ├── B Project ├── C Project ├── D Project ├── E Project (new project) │ ├── .git │ └── .gitignore ├── .git └── .gitignoreGit은 상위 저장소 안에서 다시 독립 저장소처럼 보이는 디렉토리를 만나면, does not have a commit checked out나 adding files failed 같은 에러를 낼 수 있다.
즉 이번 문제의 핵심은 모노레포처럼 관리하던 상위 저장소 안에 하위 프로젝트용 .git이 중첩돼 있었다는 점이었다.
Resolution
섹션 제목: “Resolution”새로 생성한 하위 프로젝트 안의
.git만 제거한다. (중첩 파일 제거)
해결 방법은 단순했다. 상위 저장소의 .git이 아니라, 새로 생성한 하위 프로젝트 내부의 .git만 삭제하면 된다.
예를 들어 새 프로젝트가 E Project라면 아래처럼 하위 프로젝트 기준으로 정리한다.
cd E Projectrm -rf .git .gitignore또는 상위 저장소 루트에서 경로를 명시해 지울 수도 있다.
rm -rf E Project/.git E Project/.gitignore이후 다시 상위 저장소에서 git add를 실행하면 정상적으로 파일을 스테이징할 수 있었다.
Notes
섹션 제목: “Notes”1) 지우는 대상은 하위 프로젝트의 .git이다
섹션 제목: “1) 지우는 대상은 하위 프로젝트의 .git이다”- 상위 저장소 루트에서
rm -rf .git를 실행하면 안 된다. - 반드시 새로 만든 하위 프로젝트 안의
.git만 지워야 한다.
2) 모노레포 구조에서는 중첩 저장소를 먼저 의심한다
섹션 제목: “2) 모노레포 구조에서는 중첩 저장소를 먼저 의심한다”- 상위 저장소 안에 새 프로젝트를 생성했는데
git add가 실패하면 내부에.git이 한 번 더 생겼는지 먼저 확인하는 편이 빠르다.
3) 같이 확인할 것
섹션 제목: “3) 같이 확인할 것”- 하위 프로젝트 안에
.git이 있는지 - 하위 프로젝트 안에 별도
.gitignore가 생겼는지 - 상위 저장소 루트의
.git을 잘못 건드리지 않았는지 - 중첩된
.git디렉토리를 빠르게 확인하려면 아래 명령을 사용할 수 있다.-
Terminal window find . -name .git -type d
-