-
<Git> Subtree & SubmoduleFlower in my dev/Git 2020. 11. 20. 15:18
사전준비
- subtree 와 submodule을 추가할 repo가 있는 상태
### main으로 사용할 저장소 (이하 main) ### subtree로 사용할 저장소 (이하 sub) ### git clone {main_repo} ### cd {main_dir} $ git clone git@github.com:flower/sub_main.git $ cd sub_main $ ls -alh
Subtree
- 등록
### git remote add {sub_repo_name} {sub_repo} ### git remote ### git subtree add -P {sub_dir} {sub_repo_name} ### ls -alh # ~/sub_main/ $ git remote add git@github.com:flower/subtree_sub.git $ git remote $ git subtree add -P test_sub test main $ ls -alh
- pull
main ### git status ### git add {tracked_file_name} ### git commit -m {comment} ### git push -u origin {main_branch} # ~/sub_main/ $ git status $ git add test_sub/flower.py $ git commit -m "subtree test" $ git push -u origin main sub ### git subtree pull -P {sub_dir} {sub_repo_name} {sub_branch} # ~/sub_main/ $ git pull $ git subtree pull -P test_sub test main
- push
main ### git status ### git add {tracked_file_name} ### git commit -m {comment} ### git push -u origin {main_branch} # ~/sub_main/ $ git status $ git add test_sub/flower.py $ git commit -m "subtree test" $ git push -u origin main sub ###git subtree push -P {sub_dir} {sub_repo_name} {sub_branch} # ~/sub_main/ $ git subtree push -P test_sub test main
Submodule
- 등록
### cd {main_repo_dir} ### git submodule add {submodule_repo} {submodule_dir} ### submodule_dir 생략 가능 ### cat .gitmodules cd submodule_main git submodule add git@github.com:dhgwak/submodule_sub.git cat .gitmodules ### git status ### git commit -m {comment} ### git push git status git commit -m "submodule is added" git push .gitmodules 파일이 main_repo에 존재한다면 위의 단계는 생략하고 $ git submodule init & git submodule update
- pull/push
- main과 submodule을 각각의 project로 제어
- main은 main_dir에서 submodule은 submodule_dir에서 push/pull
Subtree & Submodule 비교
-
Submoule
- Submodule은 CBD(component-based development)에 적합한 모델이며, 메인 프로젝트는 다른 컴포넌트들에 의존적이다.
- Submodule은 링크다.
- Submoudle은 저장소를 여러개의 작은 저장소로 나눌때 사용한다. 만약 서브 모듈에서 변경을 한다면 서브 모듈 안에서 커밋/푸쉬를 한 후에 메인 저장소(슈퍼 프로젝트)에서 한번 더 커밋/푸쉬를 해야 한다.
-
Subtree
- Subtree는 SBD(system-based development)에 더욱 가까우며, 모든 저장소는 모든것을 포함하고 있으며 각 부분을 수정 가능하다.
- Subtree는 복사다.
- Subtree를 사용하면 다른 저장소를 하나의 저장소로 이력과 함께 통합할수 있다. 통합을 하게 된다면 저장소의 크기는 커지지만 코드와 이력을 재 사용하기에는 더욱 좋습니다. 결국 히스토리를 관리하기에 좋다.