Q: git管理で不要なファイルを削除できないか?
過去のコミット履歴は残した状態で不要なファイル(中間情報や実行ファイル)を削除しサイズを小さくしたいのですが、実施する方法はありますか?
A: BFG Repo-Cleaner または git filter-branch を用いると履歴から特定のファイルを除去することができます
ここでは BFG Repo-Cleaner を使って対象の Git リポジトリの履歴から *.obj *.exe *.dll を除去する手順を説明します。もっと細かな変更は git filter-branch を使えば実施することができます。そちらについては Git のドキュメントをご確認ください。
① BFG Repo-Cleaner の準備
- Java 7 以降をインストール
- bfg-1.14.0.jar をダウンロード
https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar を適当なディレクトリに保存します。以降は /path/to/bfg-1.14.0.jar に保存したものとして説明します。
https://rtyley.github.io/bfg-repo-cleaner/ で最新版かどうか確認してください
- 以下のコマンドで usage が表示できることを確認
$ java -jar /path/to/bfg-1.14.0.jar bfg 1.14.0 Usage: bfg [options] [<repo>] ....
② 対象の Git リポジトリのミラーをローカルに作成
また clone が終わったらディスク使用量を du -sh などで計測しておきます。
$ git clone --mirror https://<your-site>.tracpath.com/git/<reponame> /tmp/new-repos.git $ du -sh /tmp/new-repos.git
③ 履歴から指定のファイルを削除
bfg --delete-files "*.{obj,exe,dll}" コマンドで *.obj *.exe *.dll ファイルを履歴から削除します。
履歴の変更が終わったら git gc を行い不要なファイルを整理します。終わったところでディスク使用量を du -sh などで計測します。
まだ不要なファイルがある場合は bfg を繰り返し実行します。また、誤って必要なファイルを削除していないかなども確認します。
$ cd /tmp/new-repos.git $ java -jar /path/to/bfg-1.14.0.jar --delete-files "*.{obj,exe,dll}" $ git reflog expire --expire=now --all $ git gc --prune=now --aggressive $ du -sh /tmp/new-repos.git
④ 変更したリポジトリをインポート
変更が済んだリポジトリを git fast-export を用いてダンプを行い、それを tracpath にインポートします。
$ cd /tmp/new-repos.git $ git fast-export --all | gzip -9 >/tmp/new-repos-export.gz
関連FAQ