概要・結論
git リポジトリを clone するとき、パーシャルクローンすることで fetch してくるデータサイズを小さくすることができます。
blobless clone
% git clone --filter=blob:none git@github.com:git/git.git
同様に、通常の clone をしたあとからでも git repack コマンドを使うことで手元のリポジトリを blobless 化することができます。
通常の clone
% git clone git@github.com:git/git.git
手元の git リポジトリは 303MB
% du -hs git
303M git
手元の git リポジトリを blobless 化する (git 2.43.0 以降が必要)
% cd git
% git repack -ad --filter=blob:none --filter-to=pack --no-write-bitmap-index
% git config remote.origin.promisor true
% git config remote.origin.partialclonefilter blob:none
% ls
...
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.idx
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.pack
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.rev
...
% rm pack-*.idx pack-*.pack pack-*.rev # filter で除外した pack を削除する
% cd ..
blobless 化した git リポジトリは 169MB
% du -hs git
169M git
以下、blobless 化についての解説です。
環境
この記事の内容は以下の環境で確認しました。
- macOS Sonoma 14.0 (Apple M1)
- git 2.43.0 (Homebrew)
blobless クローンについて
blobless クローンはパーシャルクローンの一種です。対象リポジトリのコミットツリーをすべて取得しますが、blob は取得しないことで手元のリポジトリを小さくすることができます。
blobless クローンの詳細は以下の記事を確認してください。
git repack
git repack コマンドは、git objects を packfile へ統合しなおすコマンドです。
以下のコマンドにより、git リポジトリの packfile から不要な blob が除外されます。
% git repack -ad --filter=blob:none --filter-to=pack --no-write-bitmap-index
--filter=blob:none
を指定すると、filter 条件を適用して packfile を生成します。
併せて --filter-to=...
を指定すると filter 条件により除外された objects の保存先を指定できます。
--filter-to=...
は git 2.43.0 から利用可能です
また、ドキュメントの指示通り -ad
と --no-write-bitmap-index
を付けておくとよさそうです。これらのオプションが本当に必要かどうかは不明です。
パーシャルクローンの設定
パーシャルクローンされたリポジトリは、未取得の objects が必要になったときにその都度 remote から objects を fetch してきます。
この動作を有効とするため、以下の設定を書き換えます。
% git config remote.origin.promisor true
% git config remote.origin.partialclonefilter blob:none
パーシャルクローンの動作について、詳細は以下のドキュメントを確認してください。
除外された packfile の削除
git repack ... --filter-to=...
により packfile から除外された objects は --filter-to=...
で指定した場所に分離して保存されているため、これを削除します。
% ls
...
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.idx
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.pack
pack-3458e8d0ab652aea3712b9be1b75603759de66a5.rev
...
% rm pack-*.idx pack-*.pack pack-*.rev
これで、手元のリポジトリが blobless 化されました。