구글링을 하다가 우연히 발견한 멋진 제목 하나!
"Git 특정 디렉터리만 clone 하기"
여러 팀이 하나의 Repository를 사용하는 "Mono-Repo" 방식으로 소스코드를 관리할 때
너무 커져버린 용량으로 인한 어려움이 있을 경우에
이런 제목의 글이 눈에 들어오기 시작한다. ^^
3개의 팀이 다음 그림과 같이 mono-repo로 개발한다고 해보자.
3개팀에서 각자 개발하는 내용이 하나의 저장소에 모이기 때문에 2가지 이슈가 있다.
1. clone 받을 때 용량이 쓸데없이(?) 커서 오래걸린다.
2. 개발할 때 쓸데없는(?) 다른 팀 내용들까지 같이 보인다.
[ background ]
일단 보통의 방법으로 clone을 해보자.
❯ git clone git@github.com:whatwant-school/git-sparse.git 'git-sparse'에 복제합니다... remote: Enumerating objects: 19, done. remote: Counting objects: 100% (3/3), done. remote: Total 19 (delta 0), reused 3 (delta 0), pack-reused 16 오브젝트를 받는 중: 100% (19/19), 200.06 MiB | 10.03 MiB/s, 완료. |
200MB 규모의 Repository이다.
tree 방식으로 디렉토리/파일을 보기 위해 tree 유틸리티 설치 후 사용해봤다.
❯ sudo apt install tree ❯ tree ./git-sparse ./git-sparse ├── README.md ├── client │ ├── client-1.dummy │ └── client-2.dummy └── server ├── server-1.dummy └── server-2.dummy 2 directories, 5 files |
50MB 크기의 파일 4개로 구성된 Repository다. (테스트를 위해 만든 저장소 ^^)
[ sparse-checkout ]
0. environment
- 이하 실습을 진행하는 환경은 다음과 같다.
. OS : Ubuntu 20.04 LTS
. Git : v2.25.1
1. git
- "sparse-checkout" 명령어는 Git v2.25.0 부터 추가되었다.
- 천만 다행으로 Ubuntu 20.04에서 제공되는 Git 패키지의 버전이 가까스로 0.00.1을 넘겼다 ^^
- 과거 Git v1.17.0 부터 "sparse checkout"을 제공했었다! (사이에 "-"가 있고 없고의 차이)
. 그 때의 명령어 사용법과 차이가 있는데, 많은 웹 포스팅에서 이를 섞어서 설명하고 있다.
2. 어렵게 clone 받기
- 블로그를 돌아다니다 보면 조금 어렵게(?) 아니 번거롭게(?) clone 받는 방법을 소개하고 있다.
❯ git init git-sparse-client /srv/workspace/git-sparse-client/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다 ❯ cd git-sparse-client ❯ git remote add origin git@github.com:whatwant-school/git-sparse.git ❯ git sparse-checkout init ❯ git sparse-checkout set /client/ ❯ cat .git/info/sparse-checkout /client/ ❯ git pull origin main remote: Enumerating objects: 19, done. remote: Counting objects: 100% (3/3), done. remote: Total 19 (delta 0), reused 3 (delta 0), pack-reused 16 오브젝트 묶음 푸는 중: 100% (19/19), 200.06 MiB | 7.07 MiB/s, 완료. github.com:whatwant-school/git-sparse URL에서 * branch main -> FETCH_HEAD * [새로운 브랜치] main -> origin/main |
으응?!
❯ tree ./ ./ └── client ├── client-1.dummy └── client-2.dummy 1 directory, 2 files |
- Work Directory의 내용만 보면 내가 원하는대로 client/ 디렉토리만 존재한다.
- 하지만, clone 받는 용량이 줄어든 것은 아니다.
- sparse-checkout 명령어는 work directory를 다루기 위한 명령어이지 전송받는 데이터 용량을 줄여주는 것은 아니다.
- 그렇다면, 위와 같이 어렵게(?) clone을 받을 필요가 없다.
3. 편하게 sparse-checkout 적용하기
- 일반적인 방법으로 clone을 받고 sparse-checkout을 이용해서 정리하는 것이 훨씬 편하다.
❯ git clone git@github.com:whatwant-school/git-sparse.git 'git-sparse'에 복제합니다... remote: Enumerating objects: 19, done. remote: Counting objects: 100% (3/3), done. remote: Total 19 (delta 0), reused 3 (delta 0), pack-reused 16 오브젝트를 받는 중: 100% (19/19), 200.06 MiB | 9.44 MiB/s, 완료. ❯ cd ./git-sparse ❯ tree ./ ./ ├── README.md ├── client │ ├── client-1.dummy │ └── client-2.dummy └── server ├── server-1.dummy └── server-2.dummy 2 directories, 5 files ❯ git sparse-checkout init ❯ git sparse-checkout set /client/ ❯ tree ./ ./ └── client ├── client-1.dummy └── client-2.dummy 1 directory, 2 files |
- 훨씬 간단하지 않은가?! ^^
4. 결론
- "sparse-checkout"은 전송 용량을 줄이기 위한 것이 아니고,
- 내가 개발하는 내용(파일)만 보면서 개발하기 위한 용도로 사용하는 것이다.
[ --filter=blob:none ]
0. background
- 웹서핑을 하다보니, clone을 순식간에 할 수 있다는 옵션을 소개하곤 했다.
1. clone
- "--filter=blob:none" 옵션을 사용하면 필요한 만큼만 blob를 내려받는다.
❯ git clone --filter=blob:none git@github.com:whatwant-school/git-sparse.git 'git-sparse'에 복제합니다... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (3/3), done. remote: Total 16 (delta 0), reused 4 (delta 0), pack-reused 12 오브젝트를 받는 중: 100% (16/16), 완료. remote: Enumerating objects: 3, done. remote: Counting objects: 100% (1/1), done. remote: Total 3 (delta 0), reused 1 (delta 0), pack-reused 2 오브젝트를 받는 중: 100% (3/3), 100.03 MiB | 9.65 MiB/s, 완료. 파일을 갱신합니다: 100% (3/3), 완료. ❯ cd git-sparse ❯ du -hs ./ 201M ./ ❯ tree ./ ./ ├── README.md ├── client │ └── client-1.dummy └── server └── server-1.dummy 2 directories, 3 files |
- 보통의 방식으로 clone 받는 것과 비교해보자.
❯ git clone git@github.com:whatwant-school/git-sparse.git 'git-sparse'에 복제합니다... remote: Enumerating objects: 21, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 21 (delta 0), reused 5 (delta 0), pack-reused 16 오브젝트를 받는 중: 100% (21/21), 200.06 MiB | 10.29 MiB/s, 완료. ❯ cd git-sparse ❯ du -hs ./ 301M ./ ❯ tree ./ ./ ├── README.md ├── client │ └── client-1.dummy └── server └── server-1.dummy 2 directories, 3 files |
- 어!? 용량이 차이가 난다! 이건 써볼만한 방법이다!!!
2. with sparse-checkout and 'no-checkout'
- clone 받을 때 "--no-checkout" 옵션을 넣으면 working directory에 checkout을 하지 않는다
- 이렇게 clone을 받은 후 해당 디렉토리를 들어가면 필요한 일부 blob를 내려받느라 시간이 조금 소요된다.
❯ git clone --filter=blob:none --no-checkout git@github.com:whatwant-school/git-sparse.git 'git-sparse-no-checkout'에 복제합니다... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (3/3), done. remote: Total 16 (delta 0), reused 4 (delta 0), pack-reused 12 오브젝트를 받는 중: 100% (16/16), 완료. ❯ cd git-sparse ❯ git sparse-checkout init ❯ git sparse-checkout set /client/ ❯ du -hs ./ 151M ./ ❯ tree ./ ./ └── client └── client-1.dummy 1 directory, 1 file |
- 용량이 또 줄었다! ^^
3. 결론
- clone 받을 때 "--filter=blob:none --no-checkout" 옵션을 추가해서 최소한으로 다운받고,
- 'sparse-checkout' 명령어를 섞어주면 내려받는 전체 용량을 확실히 줄여줄 수 있다.
git sparse-checkout 명령어에 대한 자세한 내용은 다음 링크를 참조하기 바란다.
'SCM > Git-GitHub' 카테고리의 다른 글
GitHub Models (LLM Playground + API) (0) | 2024.11.13 |
---|---|
Git 최신 버전 설치하기 (Ubuntu 20.04) (1) | 2023.07.12 |
Copilot Chat's Rules 유출(?) (0) | 2023.06.04 |
GitHub Copilot X - Chat (0) | 2023.06.04 |
GitHub-Actions 이용해서 DockerHub 업로드하기 (0) | 2023.05.30 |