일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 카카오인턴
- @Profile
- 알고리즘
- 카카오
- 스프링이란
- 이진탐색
- Singtone
- 그래프
- 이진검색
- 플로이드와샬
- 백준
- 징검다리
- bitmasking
- Spring이란
- Java
- 구현
- 쇠막대기 문제
- Spring
- BinarySearch
- 스프링
- Algorithm
- 프로그래머스
- 전화번호 목록
- 스프링프로젝트 시작하기
- 11723
- 자바
- 토비의스프링
- 가장먼노드
- sope
- 플로이드워셜
- Today
- Total
육감적 코딩
[Git 교과서]11장. 서브모듈 본문
11.1 대형 프로젝트
깃은 작은 프로젝트뿐만 아니라 큰 규모의 프로젝트도 관리하기 쉽도록 저장소를 여러 개 이용하여 단일 프로젝트를 진행할 수 있습니다.
11.1.1 저장 용량
깃 저장소는 용량 한계가 없습니다.
깃은 파일을 기반으로 데이터베이스를 관리합니다.
11.1.2 저장소 분리
용량이 크기만 한 저장소는 비효율적입니다.
필요에 따라 분할 운영하는 것이 좀 더 효율적입니다.
깃은 저장소 하나를 작은 저장소 몇 개로 분할할 수 있습니다.
이러한 저장소의 분할 개념을 서브모듈이라고 합니다.
서브 모듈은 저장소 하나가 다른 깃 저장소를 포함하는 형태를 의미합니다.
11.1.3 상하 관계
큰 규모 프로젝트는 모듈화하여 개발하는 추세.
각 기능들을 모듈화하여 독립된 깃 저장소로 관리합니다.
메인 저장소와 결합하여 재사용 됩니다.
11.2 실습을 위한 저장소 준비
11.3 서브모듈 추가
서브모듈은 2개 이상인 저장소를 부모와 자식 관계로 연결합니다.
서브모듈 명령어의 자세한 옵션을 보는 명령어
$ git submodule -help
11.3.1 저장소 연결
메인 저장소에서 자식 저장소를 연결.
서브모듈로 저장소가 추가되면 메인 저장소는 서브 저장소를 서브 폴더 형태로 취급합니다.
$ git submodule add <원격저장소URL> <폴더이름>
부모 저장소에 서브모듈을 등록하면 원격 저장소를 매개체로 자식 저장소를 복제합니다.
첫 번째로 자식의 원격 저장소가 child 폴더로 복제 되었고, 두 번째로 서브모듈의 설정 파일인 .gitmodules가 추가 되었습니다.
11.3.2 설정 파일
깃은 루트 위칭에 설정 파일을 생성합니다.
설정 파일 이름은 점(.)으로 시작되기 때문에 숨김 파일 형태로 관리합니다.
환경 설정에는 서브모듈 이름과 URL이 기록되어 있습니다.
11.3.3 모듈 커밋
status 명령어로 부모저장소의 상태를 확인.
메인 저장소와 서브모듈인 자식 저장소 간 관계를 지속적으로 유지하려면 추가된 정보들을 계속 가지고 있어야 합니다.
정보를 계속 가지려면 이를 커밋하여 저장해야 합니다.
서브모듈의 설정파일을 커밋한 뒤, 저장소 상태를 확인하면
저장소가 깔금하게 정리됩니다.
복제된 자식 저장소는 커밋하지 않았습니다.
11.4 서브모듈 작업
메인 저장소에 등록된 서브 저장소는 독립된 별도의 저장 공간 입니다.
11.4.1 모듈 저장소
메인 저장소에 등록된 서브모듈의 폴더로 이동 후, 파일 목록을 확인해 보면
child 폴더 안에 또 다른 숨긴 저장소인 .git 폴더가 있습니다. 서브 폴더는 서브모듈로 분리한 독립된 깃 저장소입니다.
11.4.2 모듈 상태
모듈로 등록된 자식 저장소를 수정합니다.
파일을 수정한 후 서브 폴더 안에서 깃 상태를 확인.
이번엔 상위 폴더에서 다시 상태를 확인
메인 저장소의 상위 폴더에서는 child 폴더만 변경했다고 출력합니다.
- child 서브 폴더안에서는 자식 저장소의 변경된 파일만 추적.
- 상위 메인 저장소에서는 서브모듈의 저장소 자체를 추적.
11.4.3 모듈 커밋
자식의 서브 폴더 저장소에서 수정한 내용을 커밋합니다.
이 커밋은 메인 저장소에서 하위로 복제 생성된 자식 저장소에만 커밋하는 것입니다.
복제된 자식 저장소에만 커밋했을 뿐, 수정한 내용을 자식의 원격 저장소에는 아직 전송하지 않았습니다.
parent/child 에는 자식의 원격 저장소보다 앞선 커밋들이 있습니다.
원격 목록을 확인합니다.
서므모듈을 추가할 때 원격 저장소를 복제합니다. 복제할 때 원격 저장소의 정보들이 자동으로 설정 됩니다.
parent/child 의 원격 저장소로 수정된 커밋을 푸시합니다.
parent/child 와 자식의 원격 저장소를 모두 갱신한 상태입니다.
11.4.4 부모 커밋
상위 메인 저장소로 이동하여 저장소의 상태를 확인.
child 폴더의 저장소가 변경된 상태를 가리킵니다.
메인 저장소의 parent/child 폴더를 수정한 후 커밋했다면, 메인 저장소의 서브모듈도 변경됩니다.
이 변경 사항을 커밋하여 기록합니다.
메인 저장소도 변경된 커밋 때문에 원격 저장소로 미전송된 ahead가 남아 있습니다.
메인 저장소의 뭔격 저장소 목록을 확인하면, 부모 메인 저장소의 원격 저장소 주소가 출력됩니다.
메인 저장소와 서브 저장소에 연결된 원격 저장소 주소는 다릅니다. 각 저장소의 폴더에서 remote 명령어로 확인할 수 있습니다.
메인 저장소의 커밋을 푸시 합니다.
서브모듈은 원격 저장소와 연결되어 있기 때문에 저장소 마다 푸시해야합니다.
11.5 자식 저장소 갱신
11.5.1 자식 저장소
자식 저장소와 메인 저장소에 등록된 저장소는 서로 다른 영역입니다.
- 현재 상태: 원격 저장소는 커밋이 최신화 되어있지만 로컬 저장소의 커밋정보와는 동기화 되지않았음. 최신 커밋정보로 갱신해야 함.
11.5.2 자식 저장소 갱신
서브모듈의 커밋들은 자식의 원격 저장소로 푸시되어있음.
수정 반영된 커밋들을 실제의 자식 저장소로 가져와야 합니다.
원격 저장소에서 pull 합니다.
11.5.3 자식 저장소 작업
이번엔 자식 저장소의 원격 저장소를 거쳐 부모 저장소의 서브모듈로 적용하는 방법을 해봄.
자식 저장소에서 child.htm 파일을 수정하고 커밋. 후 푸시
11.5.4 부모 저장소 적용
자식 저장소의 원격 저장소에서 최신 정보를 갱신합니다.
11.5.5 부모 저장소 갱신
서브모듈을 생신하면 메인 저장소는 자신의 서브 폴더가 변경된 것을 인식합니다.
메인 저장소는 서브모듈의 변경 내용을 모니터링하고 있습니다.
메인 저장소의 서브 폴더 자체를 변경했기 때문에 변경된 내용을 다시 메인 저장소로 커밋해야 합니다.
11.6 부모 저장소 복제
서브모듈의 저장소를 복제하거나 배포할 때는 부모/자식 관계도 같이 복제해야 합니다.
11.6.1 부모 저장소 복제
부모의 원격 저장소를 clone 받아 봅시다.
복제 내용을 확인해 보면
서브모듈에 대한 .gitmodules 설정 파일을 확인할 수 있습니다.
그리고 서브모듈인 child 폴더를 살펴보면, 서브모듈의 폴더 안에는 아무 내용도 없습니다.
11.6.2 모듈 업데이트
- 메인 저장소를 복제할 때는 서브모듈 정보만 같이 복제.
- 하위 저장소는 같이 복제 안함.
- 서브모듈의 하위 저장소는 직접 명령어를 실행하여 가져와야 함.
$ git submodule init -- 서브모듈 초기화
$ git submodule update -- 서브모듈 업데이트
브랜치 이름이 master가 아닌 해시 값으로 되어있습니다.
서브모듈을 업데이트 할때는 메인 저장소의 비어 있는 서브모듈 커밋 위치를 리모트 체크아웃 합니다.
11.7 부모 저장소 업데이트
부모 저장소도 별도로 관리하므로 갱신이 필요합니다.
11.7.1 부모 업데이트
자식 저장소에 코드 수정으로 커밋이 발생하면, 부모에도 새로운 커밋이 발생합니다.
갱신된 메인 저장소 내용을 정기적으로 갱신하여 서브모듈 상태를 최신으로 유지해야 합니다.
11.7.2 부모 저장소로 풀
하위 저장소에 새로운 커밋이 생성되면 메인 저장소는 이를 반영합니다.
메인 저장소는 하위 저장소의 변경된 내용 때문에 추가 커밋이 발생합니다.
자신이 메인 저장소를 복제하여 운영 한다면, 메인 저장소를 주기적으로 풀 해주어야 합니다.
'정리 > Git' 카테고리의 다른 글
[Git교과서]10장. 배포 관리와 태그 (0) | 2021.12.13 |
---|---|
[Git 교과서]9장. 복귀 (0) | 2021.12.12 |
[Git 교과서]8장. 병합과 충돌 (0) | 2021.12.12 |
[Git 교과서]7장. 임시 처리 (0) | 2021.11.30 |
[Git 교과서]6장. 브랜치 (0) | 2021.11.23 |