olrlobt

[Git] Github Repository를 Git Subtree로 하나로 합쳐서 관리하기 본문

Git

[Git] Github Repository를 Git Subtree로 하나로 합쳐서 관리하기

olrlobt 2023. 3. 2. 04:52

 

내 Github를 볼 때마다, 국비를 다니며 만들어둔 Repository가 너무 많아서,

보기에 이쁘지도 않고, 관리하기 힘들다는 생각이 들었다.

 

하지만 막상 삭제하기에는, 내가 공부한 흔적과 Github에 심어진 잔디가 아까워서 어떤 방법이 있을까 찾아보았다.

 

 

 

내가 오늘 정리할 Github - repository / (좌) 우테코 프리코스 진행 저장소 / (우) 국비 공부용 저장소

 

나는 위의 정리되지 않은 repository들을 두 분류로 나누어, 우아한 테크코스 프리코스를 진행한 레퍼지토리 하나와, 국비에서 진행한 공부내용의 레퍼지토리 하나로 묶어보려 한다.

 

 


Github Subtree

내가 사용할 방법은 Git 명령어인 Subtree이다.

 

Subtree는 여러 개의 Git repository를 폴더 하나(큰 repository)에서 관리할 수 있게 하는 기능이다. 정확히는 repository가 큰 repository의 하위파일로 분류되어 들어가진다.

 

이 점에서 Git submodule과 유사한 기능이지만, submodule은 하나를 쪼개는 기능이고, subtree는 하나로 만드는 기능이라고 이해하면 쉽다.

 

또한 subtree는 history를 그대로 유지하게 함으로써, commit 내역과 git hub의 잔디를 보존할 수 있다는 장점이 있다.

 


Subtree 사용하기

 

subtree에는 다음과 같은 명령어들이 있다.

 

  • git subtree add: 다른 Git repository를 하위 디렉터리에 추가
  • git subtree pull: 다른 Git repository에서 변경사항을 가져와 하위 디렉터리에 병합
  • git subtree push: 하위 디렉터리의 변경사항을 다른 Git repository로 푸시
  • git subtree split: 하위 디렉터리의 변경사항을 다른 Git repository로 분할

 

여기서 내가 사용할 것은 add이다.

 

git subtree add --prefix=[child repository name] [child git URL] [Branch]

 


Parents Repository 생성

먼저 Git hub에 여러 개의 Child repository를 보관할 Parents Repository를 생성한다.

일종의 폴더 역할을 한다고 생각하면 된다.

 

나는 공부한 내용들을 정리할 저장소를 만들 것이기 때문에 Study라는 이름으로 만들었다.

 

다음으로 Git을 저장하는 로컬 저장소를 열어 터미널을 켜고, 해당 git 주소를 clone 해준다.

 

git clone [https:// 깃주소]

 

클론이 완료되면, 로컬에 폴더가 생성될 것이다.

 

 

이미 생성되어 있는 레퍼지토리로 옮기거나, 로컬에서 먼저 생성해 준 경우 아래 명령어들을 참고한다.

mkdir [parents repository name] // Parents 폴더 생성
cd [parents repository name] // Parents 폴더로 이동

// origin 연결
git remote set-url --push origin https://github.com/olrlobt/Study.git

 

 

 


Child Repository 병합

 

subtree를 사용하여 Child Repository를 Parents Repository에 병합하는 작업이다.

 

subtree를 사용하기 위해서는

Child Repository의 url과 브랜치 명이 필요하다.

 

먼저 내가 옮길 Child Repository는 아래와 같다.

 

브랜치는 총 6개로 사진과 같다.

 

 

그럼, subtree를 사용해 보자.

 

먼저, 이 전에 생성해 둔 Parents Repository의 로컬 저장소에서 우클릭으로 터미널을 연다.

 

 

여기에 명령어를 작성하면 된다.

 

 

git subtree add --prefix=[child repository name] [child git URL] [Branch]
git subtree add --prefix=Java_Study_Bank https://github.com/olrlobt/Java_study_BANK.git main

 

여기서 Branch는 child repository의 branch를 작성해 주어야 하며, 한 번에 옮기는 방법은 없는 것 같다.

또한, Java_Study_Bank의 이름을 그대로 사용하기 위해, --prefix 속성에 작성해 주었다.

 

위와 같이 결과가 뜬다면 성공이고,

remote : ~~ done. 이라는 결과가 함께 뜬다면 history도 잘 옮겨진 것이다.

 

하지만, 아래 경우를 보자.

이번엔 Java_Study_Bank5의 이름으로 Study_Spring1 브랜치를 옮겨보았다.

위와는 다르게 짧은 코드와 함께 마무리가 되었는데, remote : ~~ done. 의 코드가 보이지 않는다.

 

이런 경우는 History가 어떤 이유로 옮길 수 없기 때문인데,

그런 경우는 원본 저장소의 권한 문제이거나, 공개여부 문제 등 다양한 원인이 있다.

 

만약 History를 옮기길 원한다면, 원인을 해결하고 다시 시도를 해 주어야 한다.

 

 

또한 각 브랜치를 한 번에 옮기지는 못하며, 각 브랜치별로 repository 이름을 다르게 하는 것으로 해결할  수 있다.

 

나는 6개의 브랜치를 아래와 같이 Bank1, Bank2... 와 같이 생성을 해 주었으며,

이렇게 생성을 마치게 되면 로컬 저장소에서 아래와 같이 확인할 수 있다.

 

 

 

에러

성공적으로 병합 과정이 이루어지지 못한 경우, 위와 같은 에러를 접할 수 있다.

 

이 경우 parents repository가 github에 제대로 생성이 되어있지 않은 경우이다.

간단하게 github 주소에 Readme를 만들어 주는 것으로 해결할 수 있다.

 


Parents Repository Push

 

Child Repository를 모두 subtree로 생성을 해 주었으면,

Parents Repository를 Push 해 주어야 한다.

 

git push origin HEAD:main

 

위와 같이 성공을 했다면 , Github 저장소에 잘 올라간 것을 확인할 수 있다.

 

 

 

 

Commit 수를 보면 알겠지만, History도 다음과 같이 잘 옮겨졌다.

 

 

 

Comments