Homebrew のリポジトリを GC してサイズを削減する

Homebrew のリポジトリで GC を実行して, リポジトリのサイズを削減できるサブコマンド brew git-gc を作成しました.

Homebrew と Git

Homebrew 自体や Formula, Tap はすべて Git で管理されています.  これらは多くのファイルを含み頻繁にアップデートされるため, リポジトリのサイズが肥大化する傾向にあります.

Git リポジトリは GC を実行することで, 一つのパックファイルに圧縮してリポジトリのサイズを削減することが出来ます. GC はリポジトリ内で git gc とすれば実行できるほか, 一定の条件に達すると自動で実行されます. 詳細はこちらが参考になります.

Homebrew は複数の Git リポジトリで構成されているため, それぞれのリポジトリで git gc を実行するのは面倒です. brew git-gc は Homebrew が管理しているすべてのリポジトリで簡単に GC を実行することができるコマンドです.

使い方

brew git-gc を利用するために, tap を追加します.

brew tap ymyzk/ymyzk

brew git-gc を実行すると, Homebrew が管理しているすべてのリポジトリで順に git gc を実行し, 圧縮前後のリポジトリのサイズを表示します. 次の例では約20MB圧縮することが出来ています: (注: テストのために何度か実行しているため削減量が少なくなっています.)

$ brew git-gc
/usr/local/Homebrew
$ git gc
Counting objects: 70464, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (18073/18073), done.
Writing objects: 100% (70464/70464), done.
Total 70464 (delta 50816), reused 70000 (delta 50482)
17580KB -> 15660KB

/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
$ git gc
Counting objects: 20948, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7984/7984), done.
Writing objects: 100% (20948/20948), done.
Total 20948 (delta 13183), reused 20506 (delta 12855)
17220KB -> 6736KB

〜〜〜〜〜 中略 〜〜〜〜〜

/usr/local/Homebrew/Library/Taps/ymyzk/homebrew-ymyzk
$ git gc
Counting objects: 29, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (16/16), done.
Writing objects: 100% (29/29), done.
Total 29 (delta 12), reused 29 (delta 12)
116KB -> 116KB

Total: 45924KB -> 29212KB

brew git-gcgit gc が受け付ける任意のオプションを与えることが出来ます. 例えば --aggressive オプションを利用してさらにリポジトリのサイズを小さくすることが出来ます:

$ brew git-gc --aggressive
/usr/local/Homebrew
$ git gc --aggressive
Counting objects: 70498, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (68589/68589), done.
Writing objects: 100% (70498/70498), done.
Total 70498 (delta 50846), reused 19616 (delta 0)
15804KB -> 15652KB

〜〜〜〜〜 中略 〜〜〜〜〜

Total: 29640KB -> 28984KB

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です