git 저장소 안에 또 다른 저장소가 필요한 경우 submodule 또는 subtree를 사용한다.
submodule
git 저장소 안에 다른 저장소가 들어가 있는 개념으로, 서브 프로젝트의 수정 이후에 해당 커밋을 업데이트하기 위해 메인 프로젝트에서 update --remote를 해줘야 한다. 실제 저장소의 파일들을 가지는 것이 아니라 링크로 연결되어 있으며, 저장소를 여러개의 저장소로 나눌때 사용한다. 만약 서브모듈에서 변경을 한다면 서브 모듈 안에서 커밋/푸쉬를 한 후에 메인 저장소에서 한번 더 커밋/푸쉬를 해야한다.
subtree
여러 저장소를 통합하는 개념으로 상위 저장소에 파일을 직접 추가하고 트래킹한다. 실제 저장소를 복사한 것으로, 서브트리의 파일 및 변경사항도 상위 저장소에 기록되어 다른 저장소를 하나의 저장소로 히스토리와 함께 통합할 수 있다.
모든 저장소는 모든 저장소의 파일들을 포함하고 있어 각 부분을 수정 가능하다.
서브트리의 원격에 있는 소스와 상위 저장소에 있는 소스가 서로 달라도 subtree merge 기능을 사용해 양쪽의 변경사항을 모두 반영할 수 있다.
상위 저장소에서 서브트리를 바로 수정하고 서브트리의 원격에 푸시할 수 있다는 점에서 서브모듈과 차이를 가진다. 서브트리를 추가한 모든 사용자가 서브트리의 내용을 자유롭게 변경해 원격에 푸시할 수 있다는 단점이 있다.
# 메인 프로젝트 git clone
git clone {git addr}
# 현재 프로젝트에 subtree로 사용할 원격 저장소 추가
git remote add {repo} {repo URL}
# 원격 저장소 확인
git remote -v
# subtree 추가
# --prefix 옵션으로 서브트리를 클론할 디렉토리를 지정
git subtree add --prefix={local directory} {repo} {branch}
# 서버트리를 pull, push 할 때는 prefix 옵션을 주어서 해당 서브트리가 위치한 디렉토리 정보와
# 저장소, 브랜치를 주어서 pull, push를 수행하도록 한다.
# pull
git subtree pull --prefix={local directory} {repo} {branch}
# push
git subtree push --prefix={local directory} {repo} {branch}
깃허브에서 여러 개의 레포지토리를 서브트리를 이용해 하나로 합쳐보자.
아래의 과정을 진행하기 위해 PC에 git을 설치해야 한다.
1. 깃허브에 여러 개의 레포지토리를 저장할 새로운 레포지토리를 생성한다.
2. 새로운 레포지토리를 clone 한다.
3. 바탕화면에 새로운 폴더를 생성한 후, 폴더를 우 클릭 하여 git bash here을 실행한다.
$ git init
$ git clone {새로운레포지토리주소}
$ git remote add origin {새로운레포지토리주소}
4. clone한 리포지토리는 새롭게 생성 후 커밋/푸시를 하지 않았기때문에 아무런 기록이 없는 해당 상태에서 여러 리포지토리를 합치는 과정을 진행한다면 아래의 에러가 발생할 수 있다.
Working tree has modifications. Cannot add.
위의 문제를 해결하기 위해 복제한 리포지토리에 commit 기록을 남겨준다.
$ git add .
$ git commit -m 'commit test'
5. 새로운 레포지토리에 기존의 레포지토리를 합치는 작업을 진행한다.
$ git subtree add --prefix={기존리포지토리명} {기존리포지토리주소} {기존브랜치명}
합치고 싶은 레포지토리마다 일일이 위의 명령어를 수행하여야 한다.
6. 새로운 레포지토리에 push
$ git push origin HEAD:main --force
깃허브에서 새로운 레포지토리에 들어가면 기존의 레포지토리들이 추가된 것을 확인할 수 있다.
'GitHub' 카테고리의 다른 글
pull request (1) | 2023.10.25 |
---|