Git | GitLab

[Git] Shallow Clone - 저장소의 일부 이력만 받아오기

비번변경 2024. 12. 5. 21:49

개요

간혹 몇 년에 걸쳐 유지되어 용량이 엄청 커진 Git 저장소를 클론 할 때가 있는데, 전송해야 하는 데이터의 양이 너무 많아 시간이 아주 오래 걸리거나 중간에 실패하는 경우가 발생할 수 있다.

만약 저장소의 전체 이력이 필요하지 않다면 저장소의 일부 이력만 받아오는 Shallow Clone이 방법이 될 수 있다. 이번 글에서는 git clone 또는 fetch 시 일부 이력만 받아오는 방법을 적어둔다.

 

 

depth

git clone 또는 git fetch 명령어를 사용할 때 --depth 옵션을 통해 받아올 이력, 즉 커밋의 수를 지정할 수 있다.

git clone <repository> --depth=N
git fetch --depth=N

최신 이력부터 지정한 수의 커밋을 받아오게 된다. 즉, depth를 1로 주면 최신 1개의 커밋을 받아오고, 10으로 주면 최신 10개의 커밋을 받아온다.

 

다만 Shallow Clone한 저장소에서 코드를 개발하고 원격 저장소에 push 하는 것은 거부될 수 있다. 원격 저장소 입장에서는 수정한 코드가 어떤 이력으로 만들어졌는지 확인할 수 없기 때문이다. 때문에 해당 Git 저장소의 개발자는 Shallow Clone을 사용하는 것보다 Deep Clone을 사용하는 것을 권장한다.

 

 

테스트

테스트로 https://github.com/denoland/deno 를 이용해 얕은 복사를 수행해 보자. (작성일 기준 deno는 총 12,695개의 커밋 이력을 가지고 있고, 용량은 약 143 MB이다.)

 

아래와 같이 최신 1개의 커밋만 가져와보자.

git clone https://github.com/denoland/deno --depth=1

git log에 개수를 지정하지 않았어도 하나의 커밋 이력만을 확인할 수 있다. 그리고 이 커밋은 작성일 기준 최신 커밋이 맞다.

 

이제 더 깊은 이력을 가져와보자. 아래 명령어는 최신 이력 기준 5개의 이력을 가져온다.

git fetch --depth 5

로그로 확인해보면 총 5개의 이력을 받아온 것을 확인할 수 있다.

 

 

참고 문서

https://git-scm.com/docs/shallow

https://git-scm.com/docs/git-clone

https://git-scm.com/docs/git-fetch

https://bitlog.tistory.com/66

https://graphite.dev/guides/git-fetch-depth