git履歴からバイナリ除去

バイナリをコミットしてgit履歴が肥大化してしまった場合、ファイルを特定したうえでgit filter-branchコマンドでクリーンアップできます。この作業は、誤操作により破壊するリスクはあるので注意を要します。

たとえばWordPress画像ファイルのコミットを消す例では、wp-content/uploads/をgit rmする指定で削除できます。

$ git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch wp-content/uploads/" --prune-empty -- --all

このコマンド例では–cachedオプションで消しているので、実ファイルは残ります。wp-content/uploads/に実ファイルが残っている場合はrmコマンドで削除しておきます。

git filter-branchを実行した段階で、履歴から該当ファイルは消えていますが、手元の.git/objectsは先ほど消した分も含めてまだ残っています。

新たなコミットツリーはリモートリポジトリにgit push -fで反映でき、この時点で新たな履歴に対応するオブジェクトが選択されています。

そのため、たとえばもういちど別のローカルディレクトリにgit cloneすると.git/objectsもダイエット済みの状態になっています。

⁋ 2017/11/17↻ 2024/11/07
中馬崇尋
Chuma Takahiro