서브모듈을 사용하면 .gitmodules 파일이 만들어지고 이 프로젝트를 Clone 하는 사람은 이 파일을 보고 어떤 서브모듈 프로젝트가 있는지 알 수 있다.
.gitmodules 파일
- 서브 디렉토리와 하위 프로젝트 URL의 매핑 정보를 담는 설정 파일
[submodule "SubmoduleExample"]
path = SubmoduleExample
url = http://192.168.0.131:8080/myoungmin/SubmoduleExample
아래와 같이 Clone을 받을 IP를 변경해서 명령을 해도
.gitmodules URL을 갱신하지 않아서
git clone --progress -v "http://192.168.0.114:8080/myoungmin/GitExample.git" "C:\Example"
서브모듈 업데이트를 할 때 경로 에러가 발생했었다.
git submodule update --progress --recursive --force --remote --merge
Git 서버 IP가 변경되면 .gitmodules 파일의 url을 변경해 줘야 한다.
이미 pull받은 git의 IP 주소가 변경되었다면 .gitmodules 파일을 변경하고
git submodule sync
위와 같은 명령어로 .gitmodules url을 .git/config에 반영해야한다.
Pull을 받는데 문제가 생겼던 우리회사 Git은 서브모듈을 2중으로 사용하고 있어서 아래와 같은 명령어로 문제를 해결했었다.
git pull
//Main 저장소의 서브모듈 모두를 순회하면서 원하는 브랜치로 체크아웃
git submodule foreach git checkout [체크아웃 받을 브랜치]
//Main 저장소의 서브모듈 모두를 순회하면서 브랜치 pull 받기
git submodule foreach git pull
//서브모듈 정보를 기반으로 로컬 환경설정 파일 준비 (.gitmodules 파일에 있는 정보를 .git/config에 등록)
git submodule init
//.gitmodules 파일 정보를 .git/config 와 재귀적으로 맞춰준다.
git submodule sync --recursive
//서브모듈 안으로 순회하면서 init을 해주고 sync를 맞춰준다.
git submodule foreach git submodule init
git submodule foreach git submodule sync --recursive
//Main 저장소에서 재귀적으로 서브모듈 업데이트를 해준다.
//--remote : remote repo의 최신 정보를 가져다 update
//--merge : sub project detached head 상태 방지
git submodule update --progress --recursive --force --remote --merge
//다시 Main 저장소의 서브모듈 모두를 순회하면서 develop 브랜치로 체크아웃
git submodule foreach git checkout [체크아웃 받을 브랜치]
'Git' 카테고리의 다른 글
과거 커밋들을 수정, 삭제, 병합, 분할하는 rebase -i (0) | 2022.09.18 |
---|---|
커밋을 수정하는 commit --amend (0) | 2022.09.18 |
브랜치를 다른 브랜치에 이어붙이는 rebase (0) | 2022.09.18 |
전체 Git Repository가 아닌 일부 특정폴더의 파일들만 이전 버전으로 돌리는 방법 (Reset With a Path) (0) | 2022.04.18 |
Git Commit Message 수정하기 (1) | 2021.05.17 |