はじめに
先日、パソコンの容量が埋まってしまい作業ができる状態ではなくなった。不要なファイルやアプリをとことん消したが解決には至らなかった為、より探ってみた。
No space left on device
コマンドも打てない...
原因
- 大量のバイナリファイルを抱えていたので、
.git/oblects/pack/
が肥大化していた。
Packfile
とは
- そもそもgitでは
git init
をしたとき、objectsファイル内にpack
ファイルが作られる。そしてcommitをした際に新しいobjectファイルとして.git/oblects/pack/
に圧縮するらしい。
パソコンの容量を空けた手順
- 容量を確認。
du -sh .git/objects
- 何がパックされているか、ファイルの中身を見ることができる。
git verify-pack -v .git/objects/pack/パックファイル
-
.git/objects/pack/
のtmp_pack_オブジェクトID
のファイルを削除。 -
今回はとりあえず、リモートはそのままにローカルの容量を空けたいだけなので、commit履歴自体は消さず、歴史の改変も行わない。
終わりに
- 200GBも開けることができた。
- 不要なファイルとしてコミット履歴やリモートからも消したいのであれば、下の
参考
などを元に進める必要がある。 - pushする際に
git gc
コマンドで、何がパックされているか確認することもできる。 - バイナリをgitで管理するのはあまり得策ではないように思う...
参考
- Gitリポジトリをメンテナンスして軽量化する
- gitリポジトリに入れた巨大なファイルの履歴を削除する
- HowTo completely remove a file from Git history
- 10.2 Gitの内側 - Gitオブジェクト
- Gitの.git/objectsの中身を追ってみる
- Gitの驚愕の真実:1億行のファイルに1行追記するとレポジトリ容量が200MB増える[※補足あり]
- A3.11 Appendix C: Git Commands - Administration
- gitのレポジトリ容量の削減に失敗しないためのチェックポイント
- git filter-branchで過去の全てのcommitから画像ファイルの追加/変更をなかったことにしてリポジトリを軽量化する