git add .\some-folder\
error: 'some-folder/' does not have a commit checked out
fatal: adding files failed
디렉터리가 Git 저장소의 서브모듈(submodule)로 설정되어 있는데, 그 서브모듈이 제대로 초기화되지 않았거나 체크아웃되지 않아서 발생하는 문제
즉, 하나의 디렉터리 안에 다수의 Git 저장소 존재
서브모듈(Git Submodule) : 한 Git 저장소(repo) 안에서 다른 Git 저장소를 포함할 수 있도록 해주는 기능
rm -rf .git
🔹 -r : 폴더 내부의 모든 파일과 하위 폴더를 삭제
🔹 -f : 삭제할 때 확인 없이 강제 실행
Remove-Item -Recurse -Force .git
🔹 -Recurse : 폴더 내부의 모든 파일과 하위 폴더를 삭제
🔹 -Force : 삭제할 때 확인 없이 강제 실행
rmdir /s /q .git
🔹 /s : 폴더와 그 안의 모든 내용을 삭제
🔹 /q : 삭제 확인 없이 진행
git submodule add <서브모듈_레포_URL> <디렉터리명>
git submodule add https://github.com/example/library.git libs/library
git commit -m "Added libs/library as a submodule"
✅ 결과: libs/library 폴더에 library 저장소가 추가됨
libs/library 폴더가 상위 프로젝트의 일부로 관리되지만, 독립적인 Git 저장소로 유지
git clone --recurse-submodules <프로젝트_URL>
✅ --recurse-submodules 서브모듈까지 함께 가져옴
🚨 그냥 git clone만 하면 서브모듈 폴더는 비어 있음
서브모듈은 독립적인 Git 저장소이므로, 폴더 안으로 들어가서 따로 작업할 수 있음
cd libs/library
git pull origin main # 서브모듈을 메인저장소가 아닌 서브모듈저장소의 최신 상태로 업데이트
🚨 서브모듈 내부에서 변경 후, 원래 프로젝트에서 서브모듈 업데이트 기록을 커밋해야 함.
✅ 서브모듈은 독립적인 Git 저장소이므로, 서브모듈에서 commit하고 push해도 메인 저장소에는 자동으로 반영되지 않음 (메인 저장소에서는 서브모듈의 특정 커밋을 가리키는 방식으로 관리되기 때문)
git add libs/library
git commit -m "Update submodule to latest version"
git push origin main
메인 저장소가 가리키는 서브모듈 커밋으로 이동
cd ..
git pull origin main # 메인 저장소 최신 상태 가져오기
git submodule init # 서브모듈 초기화: .gitmodules 파일에 있는 서브모듈 정보를 Git에 등록
git submodule update # 서브 모듈을 메인저장소가 가리키는 최신 버전으로 가져오기
git submodule deinit -f libs/library # Git이 서브모듈 관리 해제
git rm -r --cached libs/library # 메인 저장소에서 서브모듈 삭제
rm -rf .git/modules/libs/library # Git 내부 데이터 제거
rm -rf libs/library # 실제 파일 삭제 (원하면 실행)
git add .gitmodules # .gitmodules 변경 사항 추가
git commit -m "Completely removed submodule libs/library" # 서브모듈 삭제 반영
✅ 공유 라이브러리를 관리할 때
✅ 큰 프로젝트에서 독립적인 모듈을 유지해야 할 때
✅ 다른 팀에서 개발한 코드베이스를 특정 버전으로 유지할 때
🚨 서브모듈 사용의 단점:
서브모듈을 업데이트할 때 따로 관리해야 함
서브모듈이 많아지면 관리가 복잡해질 수 있음
💡 👉 보통은 패키지 매니저(NPM, Maven, Pip 등)를 사용하지만 서브모듈이 꼭 필요한 경우가 있음