최근에 Dockerizing 을 진행하면서 깃헙에 있는 레포지터리를 서비스별로 전부 분리시켰다. 하지만 기존에 컷밋한 깃로그들은 그대로 가져가야 했는데 레포의 사이즈가 매우 크다는 사실을 알게 되었다.
깃로딩의 속도를 개선하기 위해서 여러 블로그들을 살펴보았고 여기에 정리하고자 한다.
우선 Git은 DVCS(Distributed Version Control System) 으로, clone을 하면 사용자는 전체 history 를 로컬 저장소로 가지고 온다. 한편, Git 의 외부 저장소는 commit 이 발생함에 따라 object / pack / 등이 증가하고, 이를 gc 를 통해서 관리한다.
Git 저장소가 매우 빈번하게 업데이트 되는 경우, remote git 에 명령을 수행할 시 object를 찾고 서버에서의 명령 수행이 매우 느려진다. 따라서 remote git 저장소를 최적의 상태로 유지하거나, 이에 준하는 수준으로 관리해야 한다.
아래 링크를 통해 gc, gc — aggressive, repack 에 대한 이력과 특징을 이해할 수 있다.
https://stackoverflow.com/questions/28720151/git-gc-aggressive-vs-git-repack/
그리고 다음링크를 통해 repack 시 object, window, depth 에 대해서 알아볼 수 있다.
https://stackoverflow.com/questions/14842127/how-to-use-git-repack-a-d-depth-250-window-250
Git 서버를 운영하면, git 내부의 pack object는 최적화되지 않은 채로 끊임없이 늘어난다. 이럴 수 밖에 없는게, 원격 사용자는 끊임없이 push를 해서 새로운 delta를 만들기 때문이다. 여기서 서버 관리자는 git gc 를 통해 git 저장소를 최적화 해야 한다.
이에 대해서는 BitBucket에 잘 정리된 문서가 있다.
하지만 우리가 단순히 git gc 를 수행하면, 이는 완전히 안정된 git을 보장하지 않는다. git gc는 prune, pack, repack, rerere 등을 동시에 수행한다.
git repack --abdk --window=50 depth=5
window / depth 가 낮을수록 pack 및 object count가 빨라지고, 대신 오래된 history를 가져오는데 오래걸린다.
반대로 이 숫자가 높으면 이전 이력에 접근하기 쉬워지고, 대신 clone 속도는 떨어진다.
git repack -f -F
일단 위 명령이 실행되면 git 저장소는 이미 정리된 pack, 그리고 delta에 대한 bitmap까지 갖고 있으므로 효율적인 수준에서 repack을 수행하면 된다.
git repack -abdk — window=? — depth=?
git repack -fF