2
0

git リポジトリを clone 後に軽量化する (blobless化)

Last updated at Posted at 2023-11-21

概要・結論

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 から利用可能です

image.png

また、ドキュメントの指示通り -ad--no-write-bitmap-index を付けておくとよさそうです。これらのオプションが本当に必要かどうかは不明です。

image.png

image.png

image.png

パーシャルクローンの設定

パーシャルクローンされたリポジトリは、未取得の objects が必要になったときにその都度 remote から objects を fetch してきます。
この動作を有効とするため、以下の設定を書き換えます。

% git config remote.origin.promisor true
% git config remote.origin.partialclonefilter blob:none

image.png

パーシャルクローンの動作について、詳細は以下のドキュメントを確認してください。

除外された 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 化されました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0