Gitリポジトリを長年運用していると、徐々に容量が大きくなっていきがちです。
また、大きなバイナリファイルやnode_modulesをうっかりコミットしてしまって、rebaseするのではなくrevertで削除したものがmainにマージされたりするとどうにもなりません。
やってもよい状況であれば過去を改変してコミットをなかったことにもできますが、影響範囲も大きいのでなかなかできるものでもありません。
ref gitリポジトリの軽量化のためにやったこと
shallow cloneに関しては git shallow cloneとsparse checkoutを活用 や パーシャルクローンとシャロークローンを活用しよう - GitHubブログ
reference repositoryを活用する
gitにはすでにclone済みのローカルリポジトリを参照する機能がある
mirrorしたリポジトリは、定期的に git remote update
を実行することで参照元に追従させておく。
LFSのローカルキャッシュディレクトリを指定する
git-lfs を使っている場合
通常であれば、.git
ディレクトリ配下にオブジェクトがダウンロードされる。
そうするとgit cloneのたびにLFSオブジェクトもダウンロードされるのでキャッシュディレクトリを永続化することで回避する。
Jenkinsの場合
refspecを指定する
Jenkins の checkout
の場合、branches
で指定した以外のブランチもfetchするため、ブランチが多かったり重いファイルがあるブランチが存在する場合に時間がかかります。
これは userRemoteConfigs
の refspec
を指定することで回避できます。
これで対象のブランチのみをfetchするようになります。
Sparse checkoutの効果
sparse checkoutは必要なファイルやディレクトリのみをチェックアウトする機能です。
clone時に --no-checkout
でclone後にファイルを展開されないようにする
clone後にディレクトリに入って、 sparse-checkout set
でチェックアウトする対象を指定して、checkout
する
サイズを比較するとチェックアウトしていない分容量を節約できています。
しかしこれはあくまでワーキングツリーを展開していないことによる差分で、Receiving objects
の行を見ればわかるようにダウンロードするサイズは変わっていないことに注意してください。
つまり通信時間は変わりません。
参考