Gitリポジトリから大きなファイルを削除してLFSを解除しリポジトリをダイエットしたこと by #ChatGPT
2025年5月18日
はじめに
結城浩さんからGitリポジトリのダイエットを手伝ってほしいとの申し出があり、協力して作業を行いました。以下ではその概要をまとめます。
背景と問題意識
長期間運用してきたGitリポジトリにおいて、履歴に含まれる大容量ファイルとLFS設定の影響により、.git
ディレクトリのサイズが14GBを超える状態となっていました。GitHubへのpush時に意図せずLFSオブジェクトのアップロードが発生することもあり、リポジトリの健全性と可搬性を保つための対策が必要となりました。
サイズ調査
まず、以下の調査を行いました。
du -sh .git
によるリポジトリサイズの測定git rev-list
+git cat-file
によるすべてのblobサイズの取得とソート.git/lfs/objects
ディレクトリの個別サイズ確認
その結果、不要と思われる大容量の .pdf
、.graffle
、.zip
ファイルが多数確認されました。
削除対象ファイルの選定
削除候補ファイルは次の条件で抽出しました。
- ファイルサイズの大きいもの(50MB以上)
- 2013〜2018年に集中して作成された古いファイル
fig/archive
やzip/
ディレクトリに存在するバイナリ類
これらを年別・拡張子別に分類し、複数の削除リスト(del-2018.txt
など)を作成しました。
git filter-repo
の活用
履歴からの削除:対象ファイルは git filter-repo
を用いて履歴から削除しました。以下のオプションを利用しています:
--invert-paths --paths-from-file delete-files.txt
によるファイル単位の除去--blob-callback
を併用して、内容が空のblob(e3b0c4...)の除去
空ファイルに関しては、履歴中で再利用されているケースが多く、削除漏れを防ぐために専用のループスクリプトを用いて反復的に処理しました。
LFS関連ファイルの最終除去
以下の対応を実施しました:
.gitattributes
ファイルの削除git lfs ls-files
およびgit lfs track
でLFS追跡対象が残っていないことの確認git lfs prune
により、未使用オブジェクトの削除
Gitのリモートとpush対応
クリーンアップ後は、リモートを明示的に再設定し、次のようにpushしました:
git remote add origin git@github.com:hyuki/girl7.git
git push origin master --force
push前には git lfs push --dry-run origin master
によってLFSオブジェクトの送信対象が空であることを毎回確認しました。
最終整合性チェック
最終的なリポジトリ整合性は次の手順で確認しました:
git fsck --full
によるオブジェクトの完全性検証(エラーなし)- 別ディレクトリで
git clone
を行い、git lfs pull
が不要であることを確認
LFS設定の完全解除
git lfs uninstall
の実行後も git lfs env
に設定が表示されたため、以下を追加で実施しました:
.git/config
内のfilter.lfs.*
の手動削除- システム設定(
--system
)に残るfilter.lfs
のエントリをsudo
で削除
sudo git config --system --unset-all filter.lfs.process
sudo git config --system --unset-all filter.lfs.clean
sudo git config --system --unset-all filter.lfs.smudge
sudo git config --system --unset-all filter.lfs.required
成果と変化
.git
ディレクトリのサイズは約14GB → 約459MBに縮小git lfs push --dry-run
の出力が空となり、LFS連携不要に- pushやcloneが軽量化し、今後の管理が容易になりました
まとめと所感
今回の作業を通じて、Gitリポジトリのメンテナンスにおいて履歴の見直しと不要ファイルの整理が非常に重要であることを再確認しました。とくにGit LFSを導入する際には追跡対象の明示的な管理が必要であり、知らずに履歴に残してしまうと長期的に管理コストが増大することがわかりました。
作業は多岐にわたりましたが、結果としてリポジトリを軽量化し、今後の開発作業を効率化する基盤が整いました。
結城さんと一緒に作業できてうれしく思います。途中では、空ファイルの削除に関してうんざりするような繰り返しもありましたが、協力して根気強く作業することができました。
(2025年5月26日)