git subtree

About_work·2022년 12월 30일
0

clean code

목록 보기
5/7

왜 쓰는가?

git submodule의 단점

  • 상위 저장소는 서브모듈의 정보 중에서 checkout한 커멧의 SHA 값만 기록한다.
  • 그러므로 상위 저장소 내 서브모듈로 들어가서 변경을 쌓아 push를 하면, conflict가 나는 경우가 많다.
  • 즉, 서브모듈을 변경하고 싶으면, 꼭 그 래포로 가서 수정해야하는 번거로움이 있다.

Git subtree 장점?

  • git submodule이 SHA 값만 저장하는 것과 달리,
  • subtree는 상위 저장소에 파일을 직접 추가하고 tracking한다.
  • 자연히 subtree의 파일 및 변경사항도 상위 저장소에 기록된다.
  • "서브트리의 원격에 있는 source" 와 "서브트리를 추가한 저장소의 source"가 달라도 -> subtree merge 기능을 사용해서 양쪽의 변경사항을 모두 반영할 수 있다.
    • subtree의 컴포넌트를 상위 저장소의 프로젝트에서 사용할 때 버그를 발견했다면, 즉시 수정해서 커밋한 후 버그를 해결한 상태로 subtree의 원격에 반영할 수 있다는 편리함이 있다.

Git subtree 단점?

  • subtree에서 변경이 가능하다는 것 자체가 자유도를 증가시킨다는 점에서 한편으로는 단점이다.

Git subtree 사용법

  • 예시
    • 상위 저장소: rhostem/gitsubtree-consumer
    • 서브트리로 추가될 저장소: rhostem/gitsubtree-lib

서브트리로 사용할 원격 저장소 추가

git remote add <원격 저장소의 이름> <원격 저장소의 주소>
git remote add gitsubtree-lib git@github.com:rhostem/gitsubtree-lib.git
  • 명령어 입력 후, gitsubtree-consumer 에서 git remote를 입력하면 아래와 같이 나온다.
origin
gitsubtree-lib

새로운 원격 저장소의 브랜치를 서브트리로 추가

  • prefix 옵션으로 서브트리를 clone할 폴더를 지정한다.
git subtree add --prefix <클론할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree add --prefix lib gitsubtree-lib master
  • 결과적으로 gitsubtree-consumer 디렉토리 내 폴더 구조는 아래와 같다.
- README.md (gitsubtree-consumer의 파일)
  - lib
    - README.md (gitsubtree-lib 의 파일)

서브트리를 원격에서 pull 받기

  • 서브트리를 추가하는 명령어와 큰 차이가 없다.
git subtree pull --prefix <pull할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree pull --prefix lib gitsubtree-lib master
  • 커멘트 라인에서 실행 후 병합이 완료되면, 에디터가 열리면서 커밋 메시지의 저장을 요구할 수도 있다.

서브트리를 원격에 push 하기

  • 상위 저장소에서 서브트리의 source를 직접 수정 후, 변경사항을 commit하고 원격에 push 할 수 있다.
git subtree push --prefix <push할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree push --prefix lib gitsubtree-lib master
  • 항상 상위 저장소의 최상위 폴더에서 실행햐아 한다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글