[git] Swallow clone
shallow clone 은 git저장소의 일부 이력만 받아오는 방법이다. 즉 git 커밋등의 이력이 많아지고, 저장소 용량이 커지면 clone을 받는데, 시간도 많이 걸리고 저장소 크기도 용량이 커져서 clone, push, pull 시 시간 손해가 있을 수 있고, 어떤 경우 중단되는 경우도 있을 수 있다.
그래서 git저장소의 일부 이력만 선택적으로 받아 올 수 있다.
- 보통 swallow clone 은 저장소를 build & deployment 를 수행 할 때 유용하다.
- 저장소 소스를 수정하고 push 하는 경우에는 불리하다.
swallow clone
swallow clone을 위해서 git clone에 depth 인자에 주어진 개수만큼의 history 를 가져온다.
1 | git clone [repo_url] --depth [개수] |
최종 commit 부분만 swallow clone 하기
최종 history (git commit log) 만을 대상으로 clone 한다면 depth 1 로 주면 된다.
1 | git clone --depth 1 abcd@git.com/abc/big_repository |
git log를 보면 1개의 로그만 나타납니다. 기록이 하나밖에 안남는다.
1 | git log |
100개의 기록 더가져오기
swallow clone한 저장소에서 fetch 를 사용해서 추가적인 log 기록을 더 가져올 수 있다.
1 | git fetch --depth 50 |
주의!!!
현재 개발된 코드를 확인하고, 빌드하고 그리고 실행하고 테스트하는데는 shallow clone은 가볍게 수행할 수 있는 장점이 있다. 그런데 . 저장소에서 소스를 수정하고 push 하려고 하려면 저장소의 모든 Git 이력을 이용해 이 수정된 내용이 적용되야 한다. 그런데 swallow clone 상태에서는 어떤 기록에서 편집되었는지에 대한 것을 확인할 수 없어서 push가 거부될 수 있다.
이런 경우에는 unswallow 를 통해서 모든 history 를 복구한 후에 작업을 수행해야 한다.
unswallow 하기
기존 –depth 로 swallow clone 이 된 레포지토레애서 Un-swallow 를 하기 위해서 fetch 명령을 이용한다.
1 | $ git fetch --unshallow # 저장소의 남은 history 를 읽어온다 |
함께 보면 유용한 git 명령
간단하게 빌드/테스트 를 하기위함 이라면 `Sparse-checkout`` 과 함께 이용하면 좋다.
- 참고
[git] Swallow clone