서브모듈 개념, 사용방법
실습 (서브모듈 추가)
private으로 서브모듈저장소를 만들었고 그안에 application-dev.yml을 추가하였다.
이제 상위 레포지토리로가서 해당 리포지토리를 서브모듈로 지정한다.
(꼭 상위레포지토리 위치로 이동해서 작업해야한다)
git submodule add 서브모듈주소 추가할위치
명령어를 사용하기전 현재 디렉토리위치가 어디인지 잘 체크해야한다.
프로젝트 최상위 위치에서 다음과 같은 위치로 폴더를 추가해 서브모듈의 파일들을 저장해주었다.
config라는 폴더가 생성되면서 서브모듈리포지토리에 있던 파일이 생긴것을 확인할 수 있었다.
추가로 처음생성하면 .gitsubmodules라는 파일이 생기고, 그안에 서브모듈의 정보가 저장된다.
그리고 commit 후 push를 해보면
상위 리포지토리에서 살펴보면, 서브모듈이 신기하게 생긴 폴더로 생성되서 들어간것을 확인할 수 있다.
그렇다면 다른사람들은 해당 폴더내용을 확인할 수있을까? 크롬의 시크릿모드를 이용해서 접근해보았다.
해당 폴더를 클릭하니 404 오류를 발생시켜서 접근이 불가능하게 되어있다.
해당 private서브모듈리포지토리에 접근가능한 사람만 접근해서 파일을 확인할수있게끔 되어있는거 같았다.
서브모듈 최신내용 가져오기
git submodule update --remote
서브모듈의 원격지포지토리의 최신내용을 가져온다.
상위리포지토리에서 서브모듈 내용 수정 (1)
application-dev.yml의 내용을
logging.level.root = warn
로 바꾸고 프로젝트 최상위 위치에서 git add . , git commit~ 을 진행하려고했지만
git add . 을 해도 바뀐 내용이 추가가 되지않았다.
내가 서브모듈을 추가한 위치인 src/main/resources/config로 가서 연결된 원격리포지포리를 확인해보니 서브모듈이 나왔다. 즉 서브모듈의 위치(src/main/resources/config)로 가서 직접 git add . , git commit , git pull , git push를 진행해주면 서브모듈의 원격리포지토리에 수정된내용이 업데이트 된다.
서브모듈의 커밋내역을 보면 35cfc2b16a이다.
그리고 나서야 프로젝트 최상위위치에서 git add . 를 했을때 잘동작하는것을 확인할 수 있었다.
이렇게 프로젝트 최상위 위치에서 git add. git commit git push까지 진행하니 상위원격리포지토리에도 서브모듈의 내용이 잘 업데이트 되어있는것을 확인할 수 있었다.
상위리포지토리를 가서 확인해보면 최신커밋인 35cfc2b~로 적혀있는것을 확인가능하다.
상위리포지토리에서 서브모듈 내용 수정 (편하게)
git submodule foreach 'git add . && git commit -m "한번에" && git push'
git submodule foreach를 하면 각 서브모듈마다 진행할 명령어를 적어줄 수 있다.
"" 큰따음표가 아닌 '' 작은따음표에 적어줘야 동작하는것 같았다.
git add . ; git commit ~ ; 이런식으로 ; 를 이용해서 나눌수도있지만 ;로 나눠주면 앞에 명령어가 실패해도 뒤에 명령어들이 동작한다.
그러므로 &&를 이용하면 앞에 명령어가 실패시 뒤에 명령어는 진행되지않는다.
이렇게 해주고 프로젝트 최상위에서 git add . 하고 커밋하고 푸쉬가 잘동작하는것을 확인할 수 있었다.
서브모듈 내용 업데이트하기
git submodule update
를 하게되면 현재 상위 원격리포지토리에 적용된 서브모듈의 커밋기록을 기준으로 업데이트를 해준다.
다시말해서
서브모듈 원격리포지토리에 현재 최신 내용을 가져오는것이 아니라.
상위 원격리포지토리에 현재 저장되어있는 서브모듈의 내용을 가져오는것이다.
그래서 만약
서브모듈의 내용이 수정되었고 , 서브모듈의 원격 리포지토리까지 push되어서 최신화되어있을때
그 내용을 상위 리포지토리에 적용하고 싶다면
git submodule update --remote를 통해 서브모듈의 원격 리포지토리의 최신내용을 가져오고
git push를 통해 상위 원격리포지토리의 내용도 업데이트해준다.
서브모듈의 서브모듈까지 업데이트하기
현재 내 프로젝트에 서브모듈1이 있다고 해보자 , 그때 서브모듈1에는 서브모듈2라는 서브모듈을 가지고있고
내 프로젝트에서 서브모듈의 모든 최신내용을 가지고오고 싶을때
git submodule update --remote --recursive
명령어를 통해 서브모듈의 서브모듈내용까지 최신화할수있다.
서브모듈삭제
서브모듈을 삭제하기전 삭제명령어를 치고있는 위치를 잘파악하고 명령어를 입력해야한다.
프로젝트 최상위 위치로 간후 서브모듈에 간후 .gitmodules에 적혀있는대로
git rm -f src/main/resources/config
진행해주면 된다.
그리고 .git이라는 숨김폴더에 들어가면 modules라는 폴더가 있는데 그안에 서브모듈에 대한 정보가 남아있다.
그 내용까지 지워준다면 나중에 똑같이 src/main/resource/config 위치에 서브모듈을 추가해도 오류가 발생하지않는다고한다.
'git' 카테고리의 다른 글
git] subtree 만들기 , 오류 해결(fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.) (0) | 2023.01.19 |
---|---|
git)로컬저장소를 원격저장소의 파일들로 강제로 덮어쓰기하는법(fetch,reset --hard) (0) | 2022.10.09 |
git ignore 파일 적용하기 [미완] (1) | 2022.10.06 |
댓글